summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordgrogan@chromium.org <dgrogan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-07 22:32:49 +0000
committerdgrogan@chromium.org <dgrogan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-07 22:32:49 +0000
commitd05869d38687c55c21433254ddc6ef02b3c0ed4e (patch)
tree0c8e914e0943fa3f55e952820f45f96e3a807f0c
parentd2d79d501a2fdfd01ad1bcc96e4c54549860abe6 (diff)
downloadchromium_src-d05869d38687c55c21433254ddc6ef02b3c0ed4e.zip
chromium_src-d05869d38687c55c21433254ddc6ef02b3c0ed4e.tar.gz
chromium_src-d05869d38687c55c21433254ddc6ef02b3c0ed4e.tar.bz2
Don't delete leveldb directory if disk was full.
Also, equally as important, don't count a full disk as a corruption. This patch's functionality was added to IDB in blink, but after the IDB team forked the blink code to port to chromium. See http://src.chromium.org/viewvc/blink?view=rev&rev=150406 for the original blink patch. BUG=239882 Review URL: https://chromiumcodereview.appspot.com/16409006 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@204963 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/browser/indexed_db/indexed_db_backing_store.cc17
-rw-r--r--content/browser/indexed_db/indexed_db_backing_store.h3
-rw-r--r--content/browser/indexed_db/indexed_db_cleanup_on_io_error_unittest.cc3
-rw-r--r--content/browser/indexed_db/leveldb/leveldb_database.cc18
-rw-r--r--content/browser/indexed_db/leveldb/leveldb_database.h3
5 files changed, 32 insertions, 12 deletions
diff --git a/content/browser/indexed_db/indexed_db_backing_store.cc b/content/browser/indexed_db/indexed_db_backing_store.cc
index ccd6bf8..329127e 100644
--- a/content/browser/indexed_db/indexed_db_backing_store.cc
+++ b/content/browser/indexed_db/indexed_db_backing_store.cc
@@ -365,8 +365,8 @@ class DefaultLevelDBFactory : public LevelDBFactory {
public:
virtual scoped_ptr<LevelDBDatabase> OpenLevelDB(
const base::FilePath& file_name,
- const LevelDBComparator* comparator) OVERRIDE {
- return LevelDBDatabase::Open(file_name, comparator);
+ const LevelDBComparator* comparator, bool* is_disk_full) OVERRIDE {
+ return LevelDBDatabase::Open(file_name, comparator, is_disk_full);
}
virtual bool DestroyLevelDB(const base::FilePath& file_name) OVERRIDE {
return LevelDBDatabase::Destroy(file_name);
@@ -499,7 +499,8 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open(
base::FilePath file_path = path_base.Append(identifier_path);
- db = leveldb_factory->OpenLevelDB(file_path, comparator.get());
+ bool is_disk_full = false;
+ db = leveldb_factory->OpenLevelDB(file_path, comparator.get(), &is_disk_full);
if (db) {
bool known = false;
@@ -536,6 +537,16 @@ scoped_refptr<IndexedDBBackingStore> IndexedDBBackingStore::Open(
INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_MAX + 1,
base::HistogramBase::kUmaTargetedHistogramFlag)
->Add(INDEXED_DB_LEVEL_DB_BACKING_STORE_OPEN_SUCCESS);
+ } 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);
+ return scoped_refptr<IndexedDBBackingStore>();
} else {
LOG(ERROR) << "IndexedDB backing store open failed, attempting cleanup";
bool success = leveldb_factory->DestroyLevelDB(file_path);
diff --git a/content/browser/indexed_db/indexed_db_backing_store.h b/content/browser/indexed_db/indexed_db_backing_store.h
index 8fb5f72..fef455f 100644
--- a/content/browser/indexed_db/indexed_db_backing_store.h
+++ b/content/browser/indexed_db/indexed_db_backing_store.h
@@ -31,7 +31,8 @@ class LevelDBFactory {
virtual ~LevelDBFactory() {}
virtual scoped_ptr<LevelDBDatabase> OpenLevelDB(
const base::FilePath& file_name,
- const LevelDBComparator* comparator) = 0;
+ const LevelDBComparator* comparator,
+ bool* is_disk_full = NULL) = 0;
virtual bool DestroyLevelDB(const base::FilePath& file_name) = 0;
};
diff --git a/content/browser/indexed_db/indexed_db_cleanup_on_io_error_unittest.cc b/content/browser/indexed_db/indexed_db_cleanup_on_io_error_unittest.cc
index 3b860e3..25ebfc7 100644
--- a/content/browser/indexed_db/indexed_db_cleanup_on_io_error_unittest.cc
+++ b/content/browser/indexed_db/indexed_db_cleanup_on_io_error_unittest.cc
@@ -42,7 +42,8 @@ class MockLevelDBFactory : public LevelDBFactory {
MockLevelDBFactory() : destroy_called_(false) {}
virtual scoped_ptr<LevelDBDatabase> OpenLevelDB(
const base::FilePath& file_name,
- const LevelDBComparator* comparator) OVERRIDE {
+ const LevelDBComparator* comparator,
+ bool* is_disk_full = 0) OVERRIDE {
return BustedLevelDBDatabase::Open(file_name, comparator);
}
virtual bool DestroyLevelDB(const base::FilePath& file_name) OVERRIDE {
diff --git a/content/browser/indexed_db/leveldb/leveldb_database.cc b/content/browser/indexed_db/leveldb/leveldb_database.cc
index add72c1..316e961 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);
diff --git a/content/browser/indexed_db/leveldb/leveldb_database.h b/content/browser/indexed_db/leveldb/leveldb_database.h
index 5c3d610..5962925 100644
--- a/content/browser/indexed_db/leveldb/leveldb_database.h
+++ b/content/browser/indexed_db/leveldb/leveldb_database.h
@@ -43,7 +43,8 @@ class LevelDBSnapshot {
class CONTENT_EXPORT LevelDBDatabase {
public:
static scoped_ptr<LevelDBDatabase> Open(const base::FilePath& file_name,
- const LevelDBComparator* comparator);
+ const LevelDBComparator* comparator,
+ bool* is_disk_full = 0);
static scoped_ptr<LevelDBDatabase> OpenInMemory(
const LevelDBComparator* comparator);
static bool Destroy(const base::FilePath& file_name);