| OLD | NEW |
| 1 // Copyright 2015 The Crashpad Authors. All rights reserved. | 1 // Copyright 2015 The Crashpad Authors. All rights reserved. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| (...skipping 613 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 624 scoped_ptr<NewReport> scoped_report(report); | 624 scoped_ptr<NewReport> scoped_report(report); |
| 625 | 625 |
| 626 // Close the outstanding handle. | 626 // Close the outstanding handle. |
| 627 LoggingCloseFile(report->handle); | 627 LoggingCloseFile(report->handle); |
| 628 | 628 |
| 629 // We failed to write, so remove the dump file. There's no entry in the | 629 // We failed to write, so remove the dump file. There's no entry in the |
| 630 // metadata table yet. | 630 // metadata table yet. |
| 631 if (!DeleteFile(scoped_report->path.value().c_str())) { | 631 if (!DeleteFile(scoped_report->path.value().c_str())) { |
| 632 PLOG(ERROR) << "DeleteFile " | 632 PLOG(ERROR) << "DeleteFile " |
| 633 << base::UTF16ToUTF8(scoped_report->path.value()); | 633 << base::UTF16ToUTF8(scoped_report->path.value()); |
| 634 return CrashReportDatabase::kFileSystemError; | 634 return kFileSystemError; |
| 635 } | 635 } |
| 636 | 636 |
| 637 return kNoError; | 637 return kNoError; |
| 638 } | 638 } |
| 639 | 639 |
| 640 OperationStatus CrashReportDatabaseWin::LookUpCrashReport(const UUID& uuid, | 640 OperationStatus CrashReportDatabaseWin::LookUpCrashReport(const UUID& uuid, |
| 641 Report* report) { | 641 Report* report) { |
| 642 INITIALIZATION_STATE_DCHECK_VALID(initialized_); | 642 INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
| 643 | 643 |
| 644 scoped_ptr<Metadata> metadata(AcquireMetadata()); | 644 scoped_ptr<Metadata> metadata(AcquireMetadata()); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 684 // one possibility would be to change the interface to be FileHandle based, so | 684 // one possibility would be to change the interface to be FileHandle based, so |
| 685 // that instead of giving the file_path back to the client and changing state | 685 // that instead of giving the file_path back to the client and changing state |
| 686 // to kUploading, we return an exclusive access handle, and use that as the | 686 // to kUploading, we return an exclusive access handle, and use that as the |
| 687 // signal that the upload is pending, rather than an update to state in the | 687 // signal that the upload is pending, rather than an update to state in the |
| 688 // metadata. Alternatively, there could be a "garbage collection" at startup | 688 // metadata. Alternatively, there could be a "garbage collection" at startup |
| 689 // where any reports that are orphaned in the kUploading state are either | 689 // where any reports that are orphaned in the kUploading state are either |
| 690 // reset to kPending to retry, or discarded. | 690 // reset to kPending to retry, or discarded. |
| 691 ReportDisk* report_disk; | 691 ReportDisk* report_disk; |
| 692 OperationStatus os = metadata->FindSingleReportAndMarkDirty( | 692 OperationStatus os = metadata->FindSingleReportAndMarkDirty( |
| 693 uuid, ReportState::kPending, &report_disk); | 693 uuid, ReportState::kPending, &report_disk); |
| 694 if (os == CrashReportDatabase::kNoError) { | 694 if (os == kNoError) { |
| 695 report_disk->state = ReportState::kUploading; | 695 report_disk->state = ReportState::kUploading; |
| 696 // Create a copy for passing back to client. This will be freed in | 696 // Create a copy for passing back to client. This will be freed in |
| 697 // RecordUploadAttempt. | 697 // RecordUploadAttempt. |
| 698 *report = new Report(*report_disk); | 698 *report = new Report(*report_disk); |
| 699 } | 699 } |
| 700 return os; | 700 return os; |
| 701 } | 701 } |
| 702 | 702 |
| 703 OperationStatus CrashReportDatabaseWin::RecordUploadAttempt( | 703 OperationStatus CrashReportDatabaseWin::RecordUploadAttempt( |
| 704 const Report* report, | 704 const Report* report, |
| 705 bool successful, | 705 bool successful, |
| 706 const std::string& id) { | 706 const std::string& id) { |
| 707 INITIALIZATION_STATE_DCHECK_VALID(initialized_); | 707 INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
| 708 | 708 |
| 709 // Take ownership, allocated in GetReportForUploading. | 709 // Take ownership, allocated in GetReportForUploading. |
| 710 scoped_ptr<const Report> upload_report(report); | 710 scoped_ptr<const Report> upload_report(report); |
| 711 scoped_ptr<Metadata> metadata(AcquireMetadata()); | 711 scoped_ptr<Metadata> metadata(AcquireMetadata()); |
| 712 if (!metadata) | 712 if (!metadata) |
| 713 return kDatabaseError; | 713 return kDatabaseError; |
| 714 ReportDisk* report_disk; | 714 ReportDisk* report_disk; |
| 715 OperationStatus os = metadata->FindSingleReportAndMarkDirty( | 715 OperationStatus os = metadata->FindSingleReportAndMarkDirty( |
| 716 report->uuid, ReportState::kUploading, &report_disk); | 716 report->uuid, ReportState::kUploading, &report_disk); |
| 717 if (os == CrashReportDatabaseWin::kNoError) { | 717 if (os != kNoError) |
| 718 report_disk->uploaded = successful; | 718 return os; |
| 719 report_disk->id = id; | |
| 720 report_disk->last_upload_attempt_time = time(nullptr); | |
| 721 report_disk->upload_attempts++; | |
| 722 report_disk->state = | |
| 723 successful ? ReportState::kCompleted : ReportState::kPending; | |
| 724 } | |
| 725 | 719 |
| 726 // Call Settings::SetLastUploadAttemptTime(). | 720 time_t now = time(nullptr); |
| 727 // https://code.google.com/p/crashpad/issues/detail?id=13. | |
| 728 | 721 |
| 729 return os; | 722 report_disk->uploaded = successful; |
| 723 report_disk->id = id; |
| 724 report_disk->last_upload_attempt_time = now; |
| 725 report_disk->upload_attempts++; |
| 726 report_disk->state = |
| 727 successful ? ReportState::kCompleted : ReportState::kPending; |
| 728 |
| 729 if (!settings_.SetLastUploadAttemptTime(now)) |
| 730 return kDatabaseError; |
| 731 |
| 732 return kNoError; |
| 730 } | 733 } |
| 731 | 734 |
| 732 OperationStatus CrashReportDatabaseWin::SkipReportUpload(const UUID& uuid) { | 735 OperationStatus CrashReportDatabaseWin::SkipReportUpload(const UUID& uuid) { |
| 733 INITIALIZATION_STATE_DCHECK_VALID(initialized_); | 736 INITIALIZATION_STATE_DCHECK_VALID(initialized_); |
| 734 | 737 |
| 735 scoped_ptr<Metadata> metadata(AcquireMetadata()); | 738 scoped_ptr<Metadata> metadata(AcquireMetadata()); |
| 736 if (!metadata) | 739 if (!metadata) |
| 737 return kDatabaseError; | 740 return kDatabaseError; |
| 738 ReportDisk* report_disk; | 741 ReportDisk* report_disk; |
| 739 OperationStatus os = metadata->FindSingleReportAndMarkDirty( | 742 OperationStatus os = metadata->FindSingleReportAndMarkDirty( |
| 740 uuid, ReportState::kPending, &report_disk); | 743 uuid, ReportState::kPending, &report_disk); |
| 741 if (os == CrashReportDatabase::kNoError) | 744 if (os == kNoError) |
| 742 report_disk->state = ReportState::kCompleted; | 745 report_disk->state = ReportState::kCompleted; |
| 743 return os; | 746 return os; |
| 744 } | 747 } |
| 745 | 748 |
| 746 scoped_ptr<Metadata> CrashReportDatabaseWin::AcquireMetadata() { | 749 scoped_ptr<Metadata> CrashReportDatabaseWin::AcquireMetadata() { |
| 747 base::FilePath metadata_file = base_dir_.Append(kMetadataFileName); | 750 base::FilePath metadata_file = base_dir_.Append(kMetadataFileName); |
| 748 return Metadata::Create(metadata_file, base_dir_.Append(kReportsDirectory)); | 751 return Metadata::Create(metadata_file, base_dir_.Append(kReportsDirectory)); |
| 749 } | 752 } |
| 750 | 753 |
| 751 } // namespace | 754 } // namespace |
| 752 | 755 |
| 753 // static | 756 // static |
| 754 scoped_ptr<CrashReportDatabase> CrashReportDatabase::Initialize( | 757 scoped_ptr<CrashReportDatabase> CrashReportDatabase::Initialize( |
| 755 const base::FilePath& path) { | 758 const base::FilePath& path) { |
| 756 scoped_ptr<CrashReportDatabaseWin> database_win( | 759 scoped_ptr<CrashReportDatabaseWin> database_win( |
| 757 new CrashReportDatabaseWin(path)); | 760 new CrashReportDatabaseWin(path)); |
| 758 return database_win->Initialize() ? database_win.Pass() | 761 return database_win->Initialize() ? database_win.Pass() |
| 759 : scoped_ptr<CrashReportDatabaseWin>(); | 762 : scoped_ptr<CrashReportDatabaseWin>(); |
| 760 } | 763 } |
| 761 | 764 |
| 762 } // namespace crashpad | 765 } // namespace crashpad |
| OLD | NEW |