| 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;
|
|
|