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

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: add tests 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..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;

Powered by Google App Engine
This is Rietveld 408576698