| OLD | NEW |
| 1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved. | 1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. See the AUTHORS file for names of contributors. | 3 // found in the LICENSE file. See the AUTHORS file for names of contributors. |
| 4 | 4 |
| 5 #include "base/debug/trace_event.h" | 5 #include "base/debug/trace_event.h" |
| 6 #include "base/file_util.h" | 6 #include "base/file_util.h" |
| 7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "env_chromium_stdio.h" | 10 #include "env_chromium_stdio.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 | 25 |
| 26 const base::FilePath::CharType backup_table_extension[] = | 26 const base::FilePath::CharType backup_table_extension[] = |
| 27 FILE_PATH_LITERAL(".bak"); | 27 FILE_PATH_LITERAL(".bak"); |
| 28 const base::FilePath::CharType table_extension[] = FILE_PATH_LITERAL(".ldb"); | 28 const base::FilePath::CharType table_extension[] = FILE_PATH_LITERAL(".ldb"); |
| 29 | 29 |
| 30 static const base::FilePath::CharType kLevelDBTestDirectoryPrefix[] | 30 static const base::FilePath::CharType kLevelDBTestDirectoryPrefix[] |
| 31 = FILE_PATH_LITERAL("leveldb-test-"); | 31 = FILE_PATH_LITERAL("leveldb-test-"); |
| 32 | 32 |
| 33 class ChromiumFileLock : public FileLock { | 33 class ChromiumFileLock : public FileLock { |
| 34 public: | 34 public: |
| 35 ::base::PlatformFile file_; | 35 ::base::File file_; |
| 36 std::string name_; | 36 std::string name_; |
| 37 }; | 37 }; |
| 38 | 38 |
| 39 class Retrier { | 39 class Retrier { |
| 40 public: | 40 public: |
| 41 Retrier(MethodID method, RetrierProvider* provider) | 41 Retrier(MethodID method, RetrierProvider* provider) |
| 42 : start_(base::TimeTicks::Now()), | 42 : start_(base::TimeTicks::Now()), |
| 43 limit_(start_ + base::TimeDelta::FromMilliseconds( | 43 limit_(start_ + base::TimeDelta::FromMilliseconds( |
| 44 provider->MaxRetryTimeMillis())), | 44 provider->MaxRetryTimeMillis())), |
| 45 last_(start_), | 45 last_(start_), |
| 46 time_to_sleep_(base::TimeDelta::FromMilliseconds(10)), | 46 time_to_sleep_(base::TimeDelta::FromMilliseconds(10)), |
| 47 success_(true), | 47 success_(true), |
| 48 method_(method), | 48 method_(method), |
| 49 last_error_(base::PLATFORM_FILE_OK), | 49 last_error_(base::File::FILE_OK), |
| 50 provider_(provider) {} | 50 provider_(provider) {} |
| 51 ~Retrier() { | 51 ~Retrier() { |
| 52 if (success_) { | 52 if (success_) { |
| 53 provider_->GetRetryTimeHistogram(method_)->AddTime(last_ - start_); | 53 provider_->GetRetryTimeHistogram(method_)->AddTime(last_ - start_); |
| 54 if (last_error_ != base::PLATFORM_FILE_OK) { | 54 if (last_error_ != base::File::FILE_OK) { |
| 55 DCHECK(last_error_ < 0); | 55 DCHECK(last_error_ < 0); |
| 56 provider_->GetRecoveredFromErrorHistogram(method_)->Add(-last_error_); | 56 provider_->GetRecoveredFromErrorHistogram(method_)->Add(-last_error_); |
| 57 } | 57 } |
| 58 } | 58 } |
| 59 } | 59 } |
| 60 bool ShouldKeepTrying(base::PlatformFileError last_error) { | 60 bool ShouldKeepTrying(base::File::Error last_error) { |
| 61 DCHECK_NE(last_error, base::PLATFORM_FILE_OK); | 61 DCHECK_NE(last_error, base::File::FILE_OK); |
| 62 last_error_ = last_error; | 62 last_error_ = last_error; |
| 63 if (last_ < limit_) { | 63 if (last_ < limit_) { |
| 64 base::PlatformThread::Sleep(time_to_sleep_); | 64 base::PlatformThread::Sleep(time_to_sleep_); |
| 65 last_ = base::TimeTicks::Now(); | 65 last_ = base::TimeTicks::Now(); |
| 66 return true; | 66 return true; |
| 67 } | 67 } |
| 68 success_ = false; | 68 success_ = false; |
| 69 return false; | 69 return false; |
| 70 } | 70 } |
| 71 | 71 |
| 72 private: | 72 private: |
| 73 base::TimeTicks start_; | 73 base::TimeTicks start_; |
| 74 base::TimeTicks limit_; | 74 base::TimeTicks limit_; |
| 75 base::TimeTicks last_; | 75 base::TimeTicks last_; |
| 76 base::TimeDelta time_to_sleep_; | 76 base::TimeDelta time_to_sleep_; |
| 77 bool success_; | 77 bool success_; |
| 78 MethodID method_; | 78 MethodID method_; |
| 79 base::PlatformFileError last_error_; | 79 base::File::Error last_error_; |
| 80 RetrierProvider* provider_; | 80 RetrierProvider* provider_; |
| 81 }; | 81 }; |
| 82 | 82 |
| 83 class IDBEnvStdio : public ChromiumEnvStdio { | 83 class IDBEnvStdio : public ChromiumEnvStdio { |
| 84 public: | 84 public: |
| 85 IDBEnvStdio() : ChromiumEnvStdio() { | 85 IDBEnvStdio() : ChromiumEnvStdio() { |
| 86 name_ = "LevelDBEnv.IDB"; | 86 name_ = "LevelDBEnv.IDB"; |
| 87 make_backup_ = true; | 87 make_backup_ = true; |
| 88 } | 88 } |
| 89 }; | 89 }; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 message, | 174 message, |
| 175 method, | 175 method, |
| 176 MethodIDToString(method), | 176 MethodIDToString(method), |
| 177 saved_errno); | 177 saved_errno); |
| 178 return Status::IOError(filename, buf); | 178 return Status::IOError(filename, buf); |
| 179 } | 179 } |
| 180 | 180 |
| 181 Status MakeIOError(Slice filename, | 181 Status MakeIOError(Slice filename, |
| 182 const char* message, | 182 const char* message, |
| 183 MethodID method, | 183 MethodID method, |
| 184 base::PlatformFileError error) { | 184 base::File::Error error) { |
| 185 DCHECK(error < 0); | 185 DCHECK(error < 0); |
| 186 char buf[512]; | 186 char buf[512]; |
| 187 snprintf(buf, | 187 snprintf(buf, |
| 188 sizeof(buf), | 188 sizeof(buf), |
| 189 "%s (ChromeMethodPFE: %d::%s::%d)", | 189 "%s (ChromeMethodPFE: %d::%s::%d)", |
| 190 message, | 190 message, |
| 191 method, | 191 method, |
| 192 MethodIDToString(method), | 192 MethodIDToString(method), |
| 193 -error); | 193 -error); |
| 194 return Status::IOError(filename, buf); | 194 return Status::IOError(filename, buf); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 295 } | 295 } |
| 296 | 296 |
| 297 bool IndicatesDiskFull(const leveldb::Status& status) { | 297 bool IndicatesDiskFull(const leveldb::Status& status) { |
| 298 if (status.ok()) | 298 if (status.ok()) |
| 299 return false; | 299 return false; |
| 300 leveldb_env::MethodID method; | 300 leveldb_env::MethodID method; |
| 301 int error = -1; | 301 int error = -1; |
| 302 leveldb_env::ErrorParsingResult result = leveldb_env::ParseMethodAndError( | 302 leveldb_env::ErrorParsingResult result = leveldb_env::ParseMethodAndError( |
| 303 status.ToString().c_str(), &method, &error); | 303 status.ToString().c_str(), &method, &error); |
| 304 return (result == leveldb_env::METHOD_AND_PFE && | 304 return (result == leveldb_env::METHOD_AND_PFE && |
| 305 static_cast<base::PlatformFileError>(error) == | 305 static_cast<base::File::Error>(error) == |
| 306 base::PLATFORM_FILE_ERROR_NO_SPACE) || | 306 base::File::FILE_ERROR_NO_SPACE) || |
| 307 (result == leveldb_env::METHOD_AND_ERRNO && error == ENOSPC); | 307 (result == leveldb_env::METHOD_AND_ERRNO && error == ENOSPC); |
| 308 } | 308 } |
| 309 | 309 |
| 310 bool IsIOError(const leveldb::Status& status) { | 310 bool IsIOError(const leveldb::Status& status) { |
| 311 leveldb_env::MethodID method; | 311 leveldb_env::MethodID method; |
| 312 int error = -1; | 312 int error = -1; |
| 313 leveldb_env::ErrorParsingResult result = leveldb_env::ParseMethodAndError( | 313 leveldb_env::ErrorParsingResult result = leveldb_env::ParseMethodAndError( |
| 314 status.ToString().c_str(), &method, &error); | 314 status.ToString().c_str(), &method, &error); |
| 315 return result != leveldb_env::NONE; | 315 return result != leveldb_env::NONE; |
| 316 } | 316 } |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 ChromiumEnv::~ChromiumEnv() { | 360 ChromiumEnv::~ChromiumEnv() { |
| 361 // In chromium, ChromiumEnv is leaked. It'd be nice to add NOTREACHED here to | 361 // In chromium, ChromiumEnv is leaked. It'd be nice to add NOTREACHED here to |
| 362 // ensure that behavior isn't accidentally changed, but there's an instance in | 362 // ensure that behavior isn't accidentally changed, but there's an instance in |
| 363 // a unit test that is deleted. | 363 // a unit test that is deleted. |
| 364 } | 364 } |
| 365 | 365 |
| 366 bool ChromiumEnv::FileExists(const std::string& fname) { | 366 bool ChromiumEnv::FileExists(const std::string& fname) { |
| 367 return ::base::PathExists(CreateFilePath(fname)); | 367 return ::base::PathExists(CreateFilePath(fname)); |
| 368 } | 368 } |
| 369 | 369 |
| 370 const char* ChromiumEnv::PlatformFileErrorString(const ::base::PlatformFileError
& error) { | 370 const char* ChromiumEnv::FileErrorString(::base::File::Error error) { |
| 371 switch (error) { | 371 switch (error) { |
| 372 case ::base::PLATFORM_FILE_ERROR_FAILED: | 372 case ::base::File::FILE_ERROR_FAILED: |
| 373 return "No further details."; | 373 return "No further details."; |
| 374 case ::base::PLATFORM_FILE_ERROR_IN_USE: | 374 case ::base::File::FILE_ERROR_IN_USE: |
| 375 return "File currently in use."; | 375 return "File currently in use."; |
| 376 case ::base::PLATFORM_FILE_ERROR_EXISTS: | 376 case ::base::File::FILE_ERROR_EXISTS: |
| 377 return "File already exists."; | 377 return "File already exists."; |
| 378 case ::base::PLATFORM_FILE_ERROR_NOT_FOUND: | 378 case ::base::File::FILE_ERROR_NOT_FOUND: |
| 379 return "File not found."; | 379 return "File not found."; |
| 380 case ::base::PLATFORM_FILE_ERROR_ACCESS_DENIED: | 380 case ::base::File::FILE_ERROR_ACCESS_DENIED: |
| 381 return "Access denied."; | 381 return "Access denied."; |
| 382 case ::base::PLATFORM_FILE_ERROR_TOO_MANY_OPENED: | 382 case ::base::File::FILE_ERROR_TOO_MANY_OPENED: |
| 383 return "Too many files open."; | 383 return "Too many files open."; |
| 384 case ::base::PLATFORM_FILE_ERROR_NO_MEMORY: | 384 case ::base::File::FILE_ERROR_NO_MEMORY: |
| 385 return "Out of memory."; | 385 return "Out of memory."; |
| 386 case ::base::PLATFORM_FILE_ERROR_NO_SPACE: | 386 case ::base::File::FILE_ERROR_NO_SPACE: |
| 387 return "No space left on drive."; | 387 return "No space left on drive."; |
| 388 case ::base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY: | 388 case ::base::File::FILE_ERROR_NOT_A_DIRECTORY: |
| 389 return "Not a directory."; | 389 return "Not a directory."; |
| 390 case ::base::PLATFORM_FILE_ERROR_INVALID_OPERATION: | 390 case ::base::File::FILE_ERROR_INVALID_OPERATION: |
| 391 return "Invalid operation."; | 391 return "Invalid operation."; |
| 392 case ::base::PLATFORM_FILE_ERROR_SECURITY: | 392 case ::base::File::FILE_ERROR_SECURITY: |
| 393 return "Security error."; | 393 return "Security error."; |
| 394 case ::base::PLATFORM_FILE_ERROR_ABORT: | 394 case ::base::File::FILE_ERROR_ABORT: |
| 395 return "File operation aborted."; | 395 return "File operation aborted."; |
| 396 case ::base::PLATFORM_FILE_ERROR_NOT_A_FILE: | 396 case ::base::File::FILE_ERROR_NOT_A_FILE: |
| 397 return "The supplied path was not a file."; | 397 return "The supplied path was not a file."; |
| 398 case ::base::PLATFORM_FILE_ERROR_NOT_EMPTY: | 398 case ::base::File::FILE_ERROR_NOT_EMPTY: |
| 399 return "The file was not empty."; | 399 return "The file was not empty."; |
| 400 case ::base::PLATFORM_FILE_ERROR_INVALID_URL: | 400 case ::base::File::FILE_ERROR_INVALID_URL: |
| 401 return "Invalid URL."; | 401 return "Invalid URL."; |
| 402 case ::base::PLATFORM_FILE_ERROR_IO: | 402 case ::base::File::FILE_ERROR_IO: |
| 403 return "OS or hardware error."; | 403 return "OS or hardware error."; |
| 404 case ::base::PLATFORM_FILE_OK: | 404 case ::base::File::FILE_OK: |
| 405 return "OK."; | 405 return "OK."; |
| 406 case ::base::PLATFORM_FILE_ERROR_MAX: | 406 case ::base::File::FILE_ERROR_MAX: |
| 407 NOTREACHED(); | 407 NOTREACHED(); |
| 408 } | 408 } |
| 409 NOTIMPLEMENTED(); | 409 NOTIMPLEMENTED(); |
| 410 return "Unknown error."; | 410 return "Unknown error."; |
| 411 } | 411 } |
| 412 | 412 |
| 413 base::FilePath ChromiumEnv::RestoreFromBackup(const base::FilePath& base_name) { | 413 base::FilePath ChromiumEnv::RestoreFromBackup(const base::FilePath& base_name) { |
| 414 base::FilePath table_name = | 414 base::FilePath table_name = |
| 415 base_name.AddExtension(table_extension); | 415 base_name.AddExtension(table_extension); |
| 416 bool result = base::CopyFile(base_name.AddExtension(backup_table_extension), | 416 bool result = base::CopyFile(base_name.AddExtension(backup_table_extension), |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 459 ++it) { | 459 ++it) { |
| 460 base::FilePath restored_table_name = | 460 base::FilePath restored_table_name = |
| 461 RestoreFromBackup(dir_filepath.Append(*it)); | 461 RestoreFromBackup(dir_filepath.Append(*it)); |
| 462 result->push_back(FilePathToString(restored_table_name.BaseName())); | 462 result->push_back(FilePathToString(restored_table_name.BaseName())); |
| 463 } | 463 } |
| 464 } | 464 } |
| 465 | 465 |
| 466 Status ChromiumEnv::GetChildren(const std::string& dir_string, | 466 Status ChromiumEnv::GetChildren(const std::string& dir_string, |
| 467 std::vector<std::string>* result) { | 467 std::vector<std::string>* result) { |
| 468 std::vector<base::FilePath> entries; | 468 std::vector<base::FilePath> entries; |
| 469 base::PlatformFileError error = | 469 base::File::Error error = |
| 470 GetDirectoryEntries(CreateFilePath(dir_string), &entries); | 470 GetDirectoryEntries(CreateFilePath(dir_string), &entries); |
| 471 if (error != base::PLATFORM_FILE_OK) { | 471 if (error != base::File::FILE_OK) { |
| 472 RecordOSError(kGetChildren, error); | 472 RecordOSError(kGetChildren, error); |
| 473 return MakeIOError( | 473 return MakeIOError( |
| 474 dir_string, "Could not open/read directory", kGetChildren, error); | 474 dir_string, "Could not open/read directory", kGetChildren, error); |
| 475 } | 475 } |
| 476 result->clear(); | 476 result->clear(); |
| 477 for (std::vector<base::FilePath>::iterator it = entries.begin(); | 477 for (std::vector<base::FilePath>::iterator it = entries.begin(); |
| 478 it != entries.end(); | 478 it != entries.end(); |
| 479 ++it) { | 479 ++it) { |
| 480 result->push_back(FilePathToString(*it)); | 480 result->push_back(FilePathToString(*it)); |
| 481 } | 481 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 495 } | 495 } |
| 496 if (make_backup_ && fname_filepath.MatchesExtension(table_extension)) { | 496 if (make_backup_ && fname_filepath.MatchesExtension(table_extension)) { |
| 497 base::DeleteFile(fname_filepath.ReplaceExtension(backup_table_extension), | 497 base::DeleteFile(fname_filepath.ReplaceExtension(backup_table_extension), |
| 498 false); | 498 false); |
| 499 } | 499 } |
| 500 return result; | 500 return result; |
| 501 } | 501 } |
| 502 | 502 |
| 503 Status ChromiumEnv::CreateDir(const std::string& name) { | 503 Status ChromiumEnv::CreateDir(const std::string& name) { |
| 504 Status result; | 504 Status result; |
| 505 // TODO(rvargas): convert this code to base::File::Error. | 505 base::File::Error error = base::File::FILE_OK; |
| 506 base::PlatformFileError error = base::PLATFORM_FILE_OK; | |
| 507 Retrier retrier(kCreateDir, this); | 506 Retrier retrier(kCreateDir, this); |
| 508 do { | 507 do { |
| 509 if (base::CreateDirectoryAndGetError( | 508 if (base::CreateDirectoryAndGetError(CreateFilePath(name), &error)) |
| 510 CreateFilePath(name), | |
| 511 reinterpret_cast<base::File::Error*>(&error))) { | |
| 512 return result; | 509 return result; |
| 513 } | |
| 514 } while (retrier.ShouldKeepTrying(error)); | 510 } while (retrier.ShouldKeepTrying(error)); |
| 515 result = MakeIOError(name, "Could not create directory.", kCreateDir, error); | 511 result = MakeIOError(name, "Could not create directory.", kCreateDir, error); |
| 516 RecordOSError(kCreateDir, error); | 512 RecordOSError(kCreateDir, error); |
| 517 return result; | 513 return result; |
| 518 } | 514 } |
| 519 | 515 |
| 520 Status ChromiumEnv::DeleteDir(const std::string& name) { | 516 Status ChromiumEnv::DeleteDir(const std::string& name) { |
| 521 Status result; | 517 Status result; |
| 522 // TODO(jorlow): Should we assert this is a directory? | 518 // TODO(jorlow): Should we assert this is a directory? |
| 523 if (!::base::DeleteFile(CreateFilePath(name), false)) { | 519 if (!::base::DeleteFile(CreateFilePath(name), false)) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 541 } | 537 } |
| 542 | 538 |
| 543 Status ChromiumEnv::RenameFile(const std::string& src, const std::string& dst) { | 539 Status ChromiumEnv::RenameFile(const std::string& src, const std::string& dst) { |
| 544 Status result; | 540 Status result; |
| 545 base::FilePath src_file_path = CreateFilePath(src); | 541 base::FilePath src_file_path = CreateFilePath(src); |
| 546 if (!::base::PathExists(src_file_path)) | 542 if (!::base::PathExists(src_file_path)) |
| 547 return result; | 543 return result; |
| 548 base::FilePath destination = CreateFilePath(dst); | 544 base::FilePath destination = CreateFilePath(dst); |
| 549 | 545 |
| 550 Retrier retrier(kRenameFile, this); | 546 Retrier retrier(kRenameFile, this); |
| 551 // TODO(rvargas): convert this code to base::File::Error. | 547 base::File::Error error = base::File::FILE_OK; |
| 552 base::PlatformFileError error = base::PLATFORM_FILE_OK; | |
| 553 do { | 548 do { |
| 554 if (base::ReplaceFile(src_file_path, destination, | 549 if (base::ReplaceFile(src_file_path, destination, &error)) |
| 555 reinterpret_cast<base::File::Error*>(&error))) { | |
| 556 return result; | 550 return result; |
| 557 } | |
| 558 } while (retrier.ShouldKeepTrying(error)); | 551 } while (retrier.ShouldKeepTrying(error)); |
| 559 | 552 |
| 560 DCHECK(error != base::PLATFORM_FILE_OK); | 553 DCHECK(error != base::File::FILE_OK); |
| 561 RecordOSError(kRenameFile, error); | 554 RecordOSError(kRenameFile, error); |
| 562 char buf[100]; | 555 char buf[100]; |
| 563 snprintf(buf, | 556 snprintf(buf, |
| 564 sizeof(buf), | 557 sizeof(buf), |
| 565 "Could not rename file: %s", | 558 "Could not rename file: %s", |
| 566 PlatformFileErrorString(error)); | 559 FileErrorString(error)); |
| 567 return MakeIOError(src, buf, kRenameFile, error); | 560 return MakeIOError(src, buf, kRenameFile, error); |
| 568 } | 561 } |
| 569 | 562 |
| 570 Status ChromiumEnv::LockFile(const std::string& fname, FileLock** lock) { | 563 Status ChromiumEnv::LockFile(const std::string& fname, FileLock** lock) { |
| 571 *lock = NULL; | 564 *lock = NULL; |
| 572 Status result; | 565 Status result; |
| 573 int flags = ::base::PLATFORM_FILE_OPEN_ALWAYS | | 566 int flags = ::base::File::FLAG_OPEN_ALWAYS | |
| 574 ::base::PLATFORM_FILE_READ | | 567 ::base::File::FLAG_READ | |
| 575 ::base::PLATFORM_FILE_WRITE; | 568 ::base::File::FLAG_WRITE; |
| 576 bool created; | 569 ::base::File::Error error_code; |
| 577 ::base::PlatformFileError error_code; | 570 ::base::File file; |
| 578 ::base::PlatformFile file; | |
| 579 Retrier retrier(kLockFile, this); | 571 Retrier retrier(kLockFile, this); |
| 580 do { | 572 do { |
| 581 file = ::base::CreatePlatformFile( | 573 file.Initialize(CreateFilePath(fname), flags); |
| 582 CreateFilePath(fname), flags, &created, &error_code); | 574 if (!file.IsValid()) |
| 583 } while (error_code != ::base::PLATFORM_FILE_OK && | 575 error_code = file.error_details(); |
| 584 retrier.ShouldKeepTrying(error_code)); | 576 } while (!file.IsValid() && retrier.ShouldKeepTrying(error_code)); |
| 585 | 577 |
| 586 if (error_code == ::base::PLATFORM_FILE_ERROR_NOT_FOUND) { | 578 if (!file.IsValid()) { |
| 587 ::base::FilePath parent = CreateFilePath(fname).DirName(); | 579 if (error_code == ::base::File::FILE_ERROR_NOT_FOUND) { |
| 588 ::base::FilePath last_parent; | 580 ::base::FilePath parent = CreateFilePath(fname).DirName(); |
| 589 int num_missing_ancestors = 0; | 581 ::base::FilePath last_parent; |
| 590 do { | 582 int num_missing_ancestors = 0; |
| 591 if (base::DirectoryExists(parent)) | 583 do { |
| 592 break; | 584 if (base::DirectoryExists(parent)) |
| 593 ++num_missing_ancestors; | 585 break; |
| 594 last_parent = parent; | 586 ++num_missing_ancestors; |
| 595 parent = parent.DirName(); | 587 last_parent = parent; |
| 596 } while (parent != last_parent); | 588 parent = parent.DirName(); |
| 597 RecordLockFileAncestors(num_missing_ancestors); | 589 } while (parent != last_parent); |
| 598 } | 590 RecordLockFileAncestors(num_missing_ancestors); |
| 591 } |
| 599 | 592 |
| 600 if (error_code != ::base::PLATFORM_FILE_OK) { | 593 result = MakeIOError(fname, FileErrorString(error_code), kLockFile, |
| 601 result = MakeIOError( | 594 error_code); |
| 602 fname, PlatformFileErrorString(error_code), kLockFile, error_code); | |
| 603 RecordOSError(kLockFile, error_code); | 595 RecordOSError(kLockFile, error_code); |
| 604 return result; | 596 return result; |
| 605 } | 597 } |
| 606 | 598 |
| 607 if (!locks_.Insert(fname)) { | 599 if (!locks_.Insert(fname)) { |
| 608 result = MakeIOError(fname, "Lock file already locked.", kLockFile); | 600 result = MakeIOError(fname, "Lock file already locked.", kLockFile); |
| 609 ::base::ClosePlatformFile(file); | |
| 610 return result; | 601 return result; |
| 611 } | 602 } |
| 612 | 603 |
| 613 Retrier lock_retrier = Retrier(kLockFile, this); | 604 Retrier lock_retrier = Retrier(kLockFile, this); |
| 614 do { | 605 do { |
| 615 error_code = ::base::LockPlatformFile(file); | 606 error_code = file.Lock(); |
| 616 } while (error_code != ::base::PLATFORM_FILE_OK && | 607 } while (error_code != ::base::File::FILE_OK && |
| 617 retrier.ShouldKeepTrying(error_code)); | 608 retrier.ShouldKeepTrying(error_code)); |
| 618 | 609 |
| 619 if (error_code != ::base::PLATFORM_FILE_OK) { | 610 if (error_code != ::base::File::FILE_OK) { |
| 620 ::base::ClosePlatformFile(file); | |
| 621 locks_.Remove(fname); | 611 locks_.Remove(fname); |
| 622 result = MakeIOError( | 612 result = MakeIOError(fname, FileErrorString(error_code), kLockFile, |
| 623 fname, PlatformFileErrorString(error_code), kLockFile, error_code); | 613 error_code); |
| 624 RecordOSError(kLockFile, error_code); | 614 RecordOSError(kLockFile, error_code); |
| 625 return result; | 615 return result; |
| 626 } | 616 } |
| 627 | 617 |
| 628 ChromiumFileLock* my_lock = new ChromiumFileLock; | 618 ChromiumFileLock* my_lock = new ChromiumFileLock; |
| 629 my_lock->file_ = file; | 619 my_lock->file_ = file.Pass(); |
| 630 my_lock->name_ = fname; | 620 my_lock->name_ = fname; |
| 631 *lock = my_lock; | 621 *lock = my_lock; |
| 632 return result; | 622 return result; |
| 633 } | 623 } |
| 634 | 624 |
| 635 Status ChromiumEnv::UnlockFile(FileLock* lock) { | 625 Status ChromiumEnv::UnlockFile(FileLock* lock) { |
| 636 ChromiumFileLock* my_lock = reinterpret_cast<ChromiumFileLock*>(lock); | 626 ChromiumFileLock* my_lock = reinterpret_cast<ChromiumFileLock*>(lock); |
| 637 Status result; | 627 Status result; |
| 638 | 628 |
| 639 ::base::PlatformFileError error_code = | 629 ::base::File::Error error_code = my_lock->file_.Unlock(); |
| 640 ::base::UnlockPlatformFile(my_lock->file_); | 630 if (error_code != ::base::File::FILE_OK) { |
| 641 if (error_code != ::base::PLATFORM_FILE_OK) { | |
| 642 result = | 631 result = |
| 643 MakeIOError(my_lock->name_, "Could not unlock lock file.", kUnlockFile); | 632 MakeIOError(my_lock->name_, "Could not unlock lock file.", kUnlockFile); |
| 644 RecordOSError(kUnlockFile, error_code); | 633 RecordOSError(kUnlockFile, error_code); |
| 645 ::base::ClosePlatformFile(my_lock->file_); | |
| 646 } else if (!::base::ClosePlatformFile(my_lock->file_)) { | |
| 647 result = | |
| 648 MakeIOError(my_lock->name_, "Could not close lock file.", kUnlockFile); | |
| 649 RecordErrorAt(kUnlockFile); | |
| 650 } | 634 } |
| 651 bool removed = locks_.Remove(my_lock->name_); | 635 bool removed = locks_.Remove(my_lock->name_); |
| 652 DCHECK(removed); | 636 DCHECK(removed); |
| 653 delete my_lock; | 637 delete my_lock; |
| 654 return result; | 638 return result; |
| 655 } | 639 } |
| 656 | 640 |
| 657 Status ChromiumEnv::GetTestDirectory(std::string* path) { | 641 Status ChromiumEnv::GetTestDirectory(std::string* path) { |
| 658 mu_.Acquire(); | 642 mu_.Acquire(); |
| 659 if (test_directory_.empty()) { | 643 if (test_directory_.empty()) { |
| (...skipping 21 matching lines...) Expand all Loading... |
| 681 | 665 |
| 682 void ChromiumEnv::RecordErrorAt(MethodID method) const { | 666 void ChromiumEnv::RecordErrorAt(MethodID method) const { |
| 683 GetMethodIOErrorHistogram()->Add(method); | 667 GetMethodIOErrorHistogram()->Add(method); |
| 684 } | 668 } |
| 685 | 669 |
| 686 void ChromiumEnv::RecordLockFileAncestors(int num_missing_ancestors) const { | 670 void ChromiumEnv::RecordLockFileAncestors(int num_missing_ancestors) const { |
| 687 GetLockFileAncestorHistogram()->Add(num_missing_ancestors); | 671 GetLockFileAncestorHistogram()->Add(num_missing_ancestors); |
| 688 } | 672 } |
| 689 | 673 |
| 690 void ChromiumEnv::RecordOSError(MethodID method, | 674 void ChromiumEnv::RecordOSError(MethodID method, |
| 691 base::PlatformFileError error) const { | 675 base::File::Error error) const { |
| 692 DCHECK(error < 0); | 676 DCHECK(error < 0); |
| 693 RecordErrorAt(method); | 677 RecordErrorAt(method); |
| 694 GetOSErrorHistogram(method, -base::PLATFORM_FILE_ERROR_MAX)->Add(-error); | 678 GetOSErrorHistogram(method, -base::File::FILE_ERROR_MAX)->Add(-error); |
| 695 } | 679 } |
| 696 | 680 |
| 697 void ChromiumEnv::RecordOSError(MethodID method, int error) const { | 681 void ChromiumEnv::RecordOSError(MethodID method, int error) const { |
| 698 DCHECK(error > 0); | 682 DCHECK(error > 0); |
| 699 RecordErrorAt(method); | 683 RecordErrorAt(method); |
| 700 GetOSErrorHistogram(method, ERANGE + 1)->Add(error); | 684 GetOSErrorHistogram(method, ERANGE + 1)->Add(error); |
| 701 } | 685 } |
| 702 | 686 |
| 703 void ChromiumEnv::RecordBackupResult(bool result) const { | 687 void ChromiumEnv::RecordBackupResult(bool result) const { |
| 704 std::string uma_name(name_); | 688 std::string uma_name(name_); |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 864 Env* IDBEnv() { | 848 Env* IDBEnv() { |
| 865 return leveldb_env::idb_env.Pointer(); | 849 return leveldb_env::idb_env.Pointer(); |
| 866 } | 850 } |
| 867 | 851 |
| 868 Env* Env::Default() { | 852 Env* Env::Default() { |
| 869 return leveldb_env::default_env.Pointer(); | 853 return leveldb_env::default_env.Pointer(); |
| 870 } | 854 } |
| 871 | 855 |
| 872 } // namespace leveldb | 856 } // namespace leveldb |
| 873 | 857 |
| OLD | NEW |