diff options
author | dgrogan@chromium.org <dgrogan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-07 22:32:49 +0000 |
---|---|---|
committer | dgrogan@chromium.org <dgrogan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-07 22:32:49 +0000 |
commit | d05869d38687c55c21433254ddc6ef02b3c0ed4e (patch) | |
tree | 0c8e914e0943fa3f55e952820f45f96e3a807f0c | |
parent | d2d79d501a2fdfd01ad1bcc96e4c54549860abe6 (diff) | |
download | chromium_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
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); |