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..2207f4b7950066f1dbf7e79ccd80b9c19df220ba 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(bool cleanup_if_corrupted) { |
if (db_.get()) |
return true; |
@@ -62,14 +62,34 @@ 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 (cleanup_if_corrupted && CheckIfDatabaseCorrupted(status)) { |
+ LOG(WARNING) << "FileSystem API origin database is corrupted." |
+ << " Attempting cleanup."; |
+ if (leveldb::DestroyDB(path_, leveldb::Options()).ok()) { |
+ LOG(WARNING) << "FileSystem API origin database cleanup completed." |
+ << " Reopening."; |
+ return Init(false); |
+ } |
+ LOG(WARNING) << "Failed to cleanup FileSystem API origin database."; |
+ } |
+ |
return false; |
} |
+bool FileSystemOriginDatabase::CheckIfDatabaseCorrupted( |
+ const leveldb::Status& status) const { |
+ // TODO(tzik): Return status.code() == leveldb::Status::kCorruption, after |
+ // leveldb roll. |
+ return !status.ok(); |
+} |
+ |
void FileSystemOriginDatabase::HandleError( |
const tracked_objects::Location& from_here, leveldb::Status status) { |
db_.reset(); |
@@ -78,7 +98,7 @@ void FileSystemOriginDatabase::HandleError( |
} |
bool FileSystemOriginDatabase::HasOriginPath(const std::string& origin) { |
- if (!Init()) |
+ if (!Init(true)) |
return false; |
if (origin.empty()) |
return false; |
@@ -95,7 +115,7 @@ bool FileSystemOriginDatabase::HasOriginPath(const std::string& origin) { |
bool FileSystemOriginDatabase::GetPathForOrigin( |
const std::string& origin, FilePath* directory) { |
- if (!Init()) |
+ if (!Init(true)) |
return false; |
DCHECK(directory); |
if (origin.empty()) |
@@ -132,7 +152,7 @@ bool FileSystemOriginDatabase::GetPathForOrigin( |
} |
bool FileSystemOriginDatabase::RemovePathForOrigin(const std::string& origin) { |
- if (!Init()) |
+ if (!Init(true)) |
return false; |
leveldb::Status status = |
db_->Delete(leveldb::WriteOptions(), OriginToOriginKey(origin)); |
@@ -144,7 +164,7 @@ bool FileSystemOriginDatabase::RemovePathForOrigin(const std::string& origin) { |
bool FileSystemOriginDatabase::ListAllOrigins( |
std::vector<OriginRecord>* origins) { |
- if (!Init()) |
+ if (!Init(true)) |
return false; |
DCHECK(origins); |
scoped_ptr<leveldb::Iterator> iter(db_->NewIterator(leveldb::ReadOptions())); |
@@ -171,7 +191,7 @@ void FileSystemOriginDatabase::DropDatabase() { |
} |
bool FileSystemOriginDatabase::GetLastPathNumber(int* number) { |
- if (!Init()) |
+ if (!Init(true)) |
return false; |
DCHECK(number); |
std::string number_string; |