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

Side by Side Diff: client/crash_report_database_win.cc

Issue 1392653002: Add functionality to prune old crash reports from the database. (Closed) Base URL: https://chromium.googlesource.com/crashpad/crashpad@master
Patch Set: Created 5 years, 2 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 unified diff | Download patch
« no previous file with comments | « client/crash_report_database_test.cc ('k') | client/prune_crash_reports.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 //! This marks the metadata as dirty, and on destruction, changes will be 222 //! This marks the metadata as dirty, and on destruction, changes will be
223 //! written to disk via Write(). 223 //! written to disk via Write().
224 //! 224 //!
225 //! \return #kNoError on success. #kReportNotFound if there was no report with 225 //! \return #kNoError on success. #kReportNotFound if there was no report with
226 //! the specified UUID. #kBusyError if the report was not in the specified 226 //! the specified UUID. #kBusyError if the report was not in the specified
227 //! state. 227 //! state.
228 OperationStatus FindSingleReportAndMarkDirty(const UUID& uuid, 228 OperationStatus FindSingleReportAndMarkDirty(const UUID& uuid,
229 ReportState desired_state, 229 ReportState desired_state,
230 ReportDisk** report_disk); 230 ReportDisk** report_disk);
231 231
232 //! \brief Removes a report from the metadata database, without touching the
233 //! on-disk file.
234 //!
235 //! The returned report is only valid if CrashReportDatabase::kNoError is
236 //! returned. This will mark the database as dirty. Future metadata
237 //! operations for this report will not succeed.
238 //!
239 //! \param[in] uuid The report identifier to remove.
240 //! \param[out] report_path The found report's file_path, valid only if
241 //! CrashReportDatabase::kNoError is returned.
242 OperationStatus DeleteReport(const UUID& uuid,
243 base::FilePath* report_path);
244
232 private: 245 private:
233 Metadata(FileHandle handle, const base::FilePath& report_dir); 246 Metadata(FileHandle handle, const base::FilePath& report_dir);
234 247
235 bool Rewind(); 248 bool Rewind();
236 249
237 void Read(); 250 void Read();
238 void Write(); 251 void Write();
239 252
240 //! \brief Confirms that the corresponding report actually exists on disk 253 //! \brief Confirms that the corresponding report actually exists on disk
241 //! (that is, the dump file has not been removed), and that the report is 254 //! (that is, the dump file has not been removed), and that the report is
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 if (report_iter == reports_.end()) 357 if (report_iter == reports_.end())
345 return CrashReportDatabase::kReportNotFound; 358 return CrashReportDatabase::kReportNotFound;
346 OperationStatus os = VerifyReport(*report_iter, desired_state); 359 OperationStatus os = VerifyReport(*report_iter, desired_state);
347 if (os == CrashReportDatabase::kNoError) { 360 if (os == CrashReportDatabase::kNoError) {
348 dirty_ = true; 361 dirty_ = true;
349 *report_disk = &*report_iter; 362 *report_disk = &*report_iter;
350 } 363 }
351 return os; 364 return os;
352 } 365 }
353 366
367 OperationStatus Metadata::DeleteReport(const UUID& uuid,
368 base::FilePath* report_path) {
369 auto report_iter = std::find_if(
370 reports_.begin(), reports_.end(), [uuid](const ReportDisk& report) {
371 return report.uuid == uuid;
372 });
373 if (report_iter == reports_.end())
374 return CrashReportDatabase::kReportNotFound;
375 *report_path = report_iter->file_path;
376 reports_.erase(report_iter);
377 dirty_ = true;
378 return CrashReportDatabase::kNoError;
379 }
380
354 Metadata::Metadata(FileHandle handle, const base::FilePath& report_dir) 381 Metadata::Metadata(FileHandle handle, const base::FilePath& report_dir)
355 : handle_(handle), report_dir_(report_dir), dirty_(false), reports_() { 382 : handle_(handle), report_dir_(report_dir), dirty_(false), reports_() {
356 } 383 }
357 384
358 bool Metadata::Rewind() { 385 bool Metadata::Rewind() {
359 FileOffset result = LoggingSeekFile(handle_.get(), 0, SEEK_SET); 386 FileOffset result = LoggingSeekFile(handle_.get(), 0, SEEK_SET);
360 DCHECK_EQ(result, 0); 387 DCHECK_EQ(result, 0);
361 return result == 0; 388 return result == 0;
362 } 389 }
363 390
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
524 OperationStatus ErrorWritingCrashReport(NewReport* report) override; 551 OperationStatus ErrorWritingCrashReport(NewReport* report) override;
525 OperationStatus LookUpCrashReport(const UUID& uuid, Report* report) override; 552 OperationStatus LookUpCrashReport(const UUID& uuid, Report* report) override;
526 OperationStatus GetPendingReports(std::vector<Report>* reports) override; 553 OperationStatus GetPendingReports(std::vector<Report>* reports) override;
527 OperationStatus GetCompletedReports(std::vector<Report>* reports) override; 554 OperationStatus GetCompletedReports(std::vector<Report>* reports) override;
528 OperationStatus GetReportForUploading(const UUID& uuid, 555 OperationStatus GetReportForUploading(const UUID& uuid,
529 const Report** report) override; 556 const Report** report) override;
530 OperationStatus RecordUploadAttempt(const Report* report, 557 OperationStatus RecordUploadAttempt(const Report* report,
531 bool successful, 558 bool successful,
532 const std::string& id) override; 559 const std::string& id) override;
533 OperationStatus SkipReportUpload(const UUID& uuid) override; 560 OperationStatus SkipReportUpload(const UUID& uuid) override;
561 OperationStatus DeleteReport(const UUID& uuid) override;
534 562
535 private: 563 private:
536 scoped_ptr<Metadata> AcquireMetadata(); 564 scoped_ptr<Metadata> AcquireMetadata();
537 565
538 base::FilePath base_dir_; 566 base::FilePath base_dir_;
539 Settings settings_; 567 Settings settings_;
540 InitializationStateDcheck initialized_; 568 InitializationStateDcheck initialized_;
541 569
542 DISALLOW_COPY_AND_ASSIGN(CrashReportDatabaseWin); 570 DISALLOW_COPY_AND_ASSIGN(CrashReportDatabaseWin);
543 }; 571 };
544 572
545 CrashReportDatabaseWin::CrashReportDatabaseWin(const base::FilePath& path) 573 CrashReportDatabaseWin::CrashReportDatabaseWin(const base::FilePath& path)
546 : CrashReportDatabase(), 574 : CrashReportDatabase(),
547 base_dir_(path), 575 base_dir_(path),
548 settings_(base_dir_.Append(kSettings)), 576 settings_(base_dir_.Append(kSettings)),
549 initialized_() { 577 initialized_() {
550 } 578 }
551 579
552 CrashReportDatabaseWin::~CrashReportDatabaseWin() { 580 CrashReportDatabaseWin::~CrashReportDatabaseWin() {
553 } 581 }
554 582
555 bool CrashReportDatabaseWin::Initialize() { 583 bool CrashReportDatabaseWin::Initialize() {
556 INITIALIZATION_STATE_SET_INITIALIZING(initialized_); 584 INITIALIZATION_STATE_SET_INITIALIZING(initialized_);
557 585
558 // Ensure the database and report subdirectories exist. 586 // Ensure the database and report subdirectories exist.
559 if (!CreateDirectoryIfNecessary(base_dir_) || 587 if (!CreateDirectoryIfNecessary(base_dir_) ||
560 !CreateDirectoryIfNecessary(base_dir_.Append(kReportsDirectory))) 588 !CreateDirectoryIfNecessary(base_dir_.Append(kReportsDirectory)))
561 return false; 589 return false;
562 590
563 // TODO(scottmg): When are completed reports pruned from disk? Delete here or
564 // maybe on AcquireMetadata().
565
566 if (!settings_.Initialize()) 591 if (!settings_.Initialize())
567 return false; 592 return false;
568 593
569 INITIALIZATION_STATE_SET_VALID(initialized_); 594 INITIALIZATION_STATE_SET_VALID(initialized_);
570 return true; 595 return true;
571 } 596 }
572 597
573 Settings* CrashReportDatabaseWin::GetSettings() { 598 Settings* CrashReportDatabaseWin::GetSettings() {
574 INITIALIZATION_STATE_DCHECK_VALID(initialized_); 599 INITIALIZATION_STATE_DCHECK_VALID(initialized_);
575 return &settings_; 600 return &settings_;
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 report_disk->upload_attempts++; 750 report_disk->upload_attempts++;
726 report_disk->state = 751 report_disk->state =
727 successful ? ReportState::kCompleted : ReportState::kPending; 752 successful ? ReportState::kCompleted : ReportState::kPending;
728 753
729 if (!settings_.SetLastUploadAttemptTime(now)) 754 if (!settings_.SetLastUploadAttemptTime(now))
730 return kDatabaseError; 755 return kDatabaseError;
731 756
732 return kNoError; 757 return kNoError;
733 } 758 }
734 759
760 OperationStatus CrashReportDatabaseWin::DeleteReport(const UUID& uuid) {
761 INITIALIZATION_STATE_DCHECK_VALID(initialized_);
762
763 scoped_ptr<Metadata> metadata(AcquireMetadata());
764 if (!metadata)
765 return kDatabaseError;
766
767 base::FilePath report_path;
768 OperationStatus os = metadata->DeleteReport(uuid, &report_path);
769 if (os != kNoError)
770 return os;
771
772 if (!DeleteFile(report_path.value().c_str())) {
773 PLOG(ERROR) << "DeleteFile "
774 << base::UTF16ToUTF8(report_path.value());
775 return kFileSystemError;
776 }
777 return kNoError;
778 }
779
735 OperationStatus CrashReportDatabaseWin::SkipReportUpload(const UUID& uuid) { 780 OperationStatus CrashReportDatabaseWin::SkipReportUpload(const UUID& uuid) {
736 INITIALIZATION_STATE_DCHECK_VALID(initialized_); 781 INITIALIZATION_STATE_DCHECK_VALID(initialized_);
737 782
738 scoped_ptr<Metadata> metadata(AcquireMetadata()); 783 scoped_ptr<Metadata> metadata(AcquireMetadata());
739 if (!metadata) 784 if (!metadata)
740 return kDatabaseError; 785 return kDatabaseError;
741 ReportDisk* report_disk; 786 ReportDisk* report_disk;
742 OperationStatus os = metadata->FindSingleReportAndMarkDirty( 787 OperationStatus os = metadata->FindSingleReportAndMarkDirty(
743 uuid, ReportState::kPending, &report_disk); 788 uuid, ReportState::kPending, &report_disk);
744 if (os == kNoError) 789 if (os == kNoError)
(...skipping 11 matching lines...) Expand all
756 // static 801 // static
757 scoped_ptr<CrashReportDatabase> CrashReportDatabase::Initialize( 802 scoped_ptr<CrashReportDatabase> CrashReportDatabase::Initialize(
758 const base::FilePath& path) { 803 const base::FilePath& path) {
759 scoped_ptr<CrashReportDatabaseWin> database_win( 804 scoped_ptr<CrashReportDatabaseWin> database_win(
760 new CrashReportDatabaseWin(path)); 805 new CrashReportDatabaseWin(path));
761 return database_win->Initialize() ? database_win.Pass() 806 return database_win->Initialize() ? database_win.Pass()
762 : scoped_ptr<CrashReportDatabaseWin>(); 807 : scoped_ptr<CrashReportDatabaseWin>();
763 } 808 }
764 809
765 } // namespace crashpad 810 } // namespace crashpad
OLDNEW
« no previous file with comments | « client/crash_report_database_test.cc ('k') | client/prune_crash_reports.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698