Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2684)

Unified Diff: webkit/fileapi/file_system_origin_database.cc

Issue 9663021: Add database recovery for FileSystemOriginDatabase (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: bool -> enum Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webkit/fileapi/file_system_origin_database.cc
diff --git a/webkit/fileapi/file_system_origin_database.cc b/webkit/fileapi/file_system_origin_database.cc
index 125576ae38d1eda4f7dfeae35a63059f1b326c06..c30204b306b46f5df2f79bfa97a74eaceea3b8cf 100644
--- a/webkit/fileapi/file_system_origin_database.cc
+++ b/webkit/fileapi/file_system_origin_database.cc
@@ -54,7 +54,7 @@ FileSystemOriginDatabase::FileSystemOriginDatabase(const FilePath& path) {
FileSystemOriginDatabase::~FileSystemOriginDatabase() {
}
-bool FileSystemOriginDatabase::Init() {
+bool FileSystemOriginDatabase::Init(RecoveringOption recovering_option) {
if (db_.get())
return true;
@@ -62,11 +62,25 @@ bool FileSystemOriginDatabase::Init() {
options.create_if_missing = true;
leveldb::DB* db;
leveldb::Status status = leveldb::DB::Open(options, path_, &db);
+ // TODO(tzik): Collect status metrics here.
if (status.ok()) {
db_.reset(db);
return true;
}
HandleError(FROM_HERE, status);
+
+ if (recovering_option == LEAVE_ON_CORRUPTION)
+ return false;
+
+ DCHECK_EQ(REBUILD_ON_CORRUPTION, recovering_option);
+ LOG(WARNING) << "FileSystem API origin database is corrupted."
+ << " Attempting cleanup.";
+ if (leveldb::DestroyDB(path_, leveldb::Options()).ok()) {
michaeln 2012/03/11 17:40:10 once we've lost this database of all origins using
ericu 2012/03/12 19:46:01 Yes. If we lose the origins database, we have no
+ LOG(WARNING) << "FileSystem API origin database cleanup completed."
+ << " Reopening.";
+ return Init(LEAVE_ON_CORRUPTION);
+ }
+ LOG(WARNING) << "Failed to cleanup FileSystem API origin database.";
return false;
}
@@ -78,7 +92,7 @@ void FileSystemOriginDatabase::HandleError(
}
bool FileSystemOriginDatabase::HasOriginPath(const std::string& origin) {
- if (!Init())
+ if (!Init(REBUILD_ON_CORRUPTION))
return false;
if (origin.empty())
return false;
@@ -95,7 +109,7 @@ bool FileSystemOriginDatabase::HasOriginPath(const std::string& origin) {
bool FileSystemOriginDatabase::GetPathForOrigin(
const std::string& origin, FilePath* directory) {
- if (!Init())
+ if (!Init(REBUILD_ON_CORRUPTION))
return false;
DCHECK(directory);
if (origin.empty())
@@ -132,7 +146,7 @@ bool FileSystemOriginDatabase::GetPathForOrigin(
}
bool FileSystemOriginDatabase::RemovePathForOrigin(const std::string& origin) {
- if (!Init())
+ if (!Init(REBUILD_ON_CORRUPTION))
return false;
leveldb::Status status =
db_->Delete(leveldb::WriteOptions(), OriginToOriginKey(origin));
@@ -144,7 +158,7 @@ bool FileSystemOriginDatabase::RemovePathForOrigin(const std::string& origin) {
bool FileSystemOriginDatabase::ListAllOrigins(
std::vector<OriginRecord>* origins) {
- if (!Init())
+ if (!Init(REBUILD_ON_CORRUPTION))
return false;
DCHECK(origins);
scoped_ptr<leveldb::Iterator> iter(db_->NewIterator(leveldb::ReadOptions()));
@@ -171,7 +185,7 @@ void FileSystemOriginDatabase::DropDatabase() {
}
bool FileSystemOriginDatabase::GetLastPathNumber(int* number) {
- if (!Init())
+ if (!Init(REBUILD_ON_CORRUPTION))
return false;
DCHECK(number);
std::string number_string;

Powered by Google App Engine
This is Rietveld 408576698