From 18a294130552dc827339f0ca57794177cee2b552 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Tue, 5 Jan 2016 15:09:00 -0500 Subject: [PATCH] Create the PruneCrashReportsThread in the handler. This will prune the database on a daily basis, in accordance with the specified condition. BUG=crashpad:22 R=mark@chromium.org Review URL: https://codereview.chromium.org/1534503002 . --- handler/handler.gyp | 6 ++- handler/handler_main.cc | 7 +++ handler/prune_crash_reports_thread.cc | 42 +++++++++++++++ handler/prune_crash_reports_thread.h | 75 +++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 2 deletions(-) create mode 100644 handler/prune_crash_reports_thread.cc create mode 100644 handler/prune_crash_reports_thread.h diff --git a/handler/handler.gyp b/handler/handler.gyp index e7f54c82..9a520a27 100644 --- a/handler/handler.gyp +++ b/handler/handler.gyp @@ -38,12 +38,14 @@ 'sources': [ 'crash_report_upload_thread.cc', 'crash_report_upload_thread.h', + 'handler_main.cc', + 'handler_main.h', 'mac/crash_report_exception_handler.cc', 'mac/crash_report_exception_handler.h', 'mac/exception_handler_server.cc', 'mac/exception_handler_server.h', - 'handler_main.cc', - 'handler_main.h', + 'prune_crash_reports_thread.cc', + 'prune_crash_reports_thread.h', 'win/crash_report_exception_handler.cc', 'win/crash_report_exception_handler.h', ], diff --git a/handler/handler_main.cc b/handler/handler_main.cc index 7ad13f6f..19d0da7a 100644 --- a/handler/handler_main.cc +++ b/handler/handler_main.cc @@ -31,8 +31,10 @@ #include "build/build_config.h" #include "client/crash_report_database.h" #include "client/crashpad_client.h" +#include "client/prune_crash_reports.h" #include "tools/tool_support.h" #include "handler/crash_report_upload_thread.h" +#include "handler/prune_crash_reports_thread.h" #include "util/file/file_io.h" #include "util/stdlib/map_insert.h" #include "util/stdlib/string_number_conversion.h" @@ -372,12 +374,17 @@ int HandlerMain(int argc, char* argv[]) { CrashReportUploadThread upload_thread(database.get(), options.url); upload_thread.Start(); + PruneCrashReportThread prune_thread(database.get(), + PruneCondition::GetDefault()); + prune_thread.Start(); + CrashReportExceptionHandler exception_handler( database.get(), &upload_thread, &options.annotations); exception_handler_server.Run(&exception_handler); upload_thread.Stop(); + prune_thread.Stop(); return EXIT_SUCCESS; } diff --git a/handler/prune_crash_reports_thread.cc b/handler/prune_crash_reports_thread.cc new file mode 100644 index 00000000..be3631f3 --- /dev/null +++ b/handler/prune_crash_reports_thread.cc @@ -0,0 +1,42 @@ +// Copyright 2016 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "handler/prune_crash_reports_thread.h" + +#include "client/prune_crash_reports.h" + +namespace crashpad { + +PruneCrashReportThread::PruneCrashReportThread( + CrashReportDatabase* database, + scoped_ptr condition) + : thread_(60 * 60 * 24, this), + condition_(condition.Pass()), + database_(database) {} + +PruneCrashReportThread::~PruneCrashReportThread() {} + +void PruneCrashReportThread::Start() { + thread_.Start(60 * 10); +} + +void PruneCrashReportThread::Stop() { + thread_.Stop(); +} + +void PruneCrashReportThread::DoWork(const WorkerThread* thread) { + PruneCrashReportDatabase(database_, condition_.get()); +} + +} // namespace crashpad diff --git a/handler/prune_crash_reports_thread.h b/handler/prune_crash_reports_thread.h new file mode 100644 index 00000000..d4eb1253 --- /dev/null +++ b/handler/prune_crash_reports_thread.h @@ -0,0 +1,75 @@ +// Copyright 2016 The Crashpad Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef CRASHPAD_HANDLER_PRUNE_CRASH_REPORTS_THREAD_H_ +#define CRASHPAD_HANDLER_PRUNE_CRASH_REPORTS_THREAD_H_ + +#include "base/basictypes.h" +#include "base/memory/scoped_ptr.h" +#include "util/thread/worker_thread.h" + +namespace crashpad { + +class CrashReportDatabase; +class PruneCondition; + +//! \brief A thread that periodically prunes crash reports from the database +//! using the specified condition. +//! +//! After the thread is started, the database is pruned using the condition +//! every 24 hours. Upon calling Start(), the thread waits 10 minutes before +//! performing the initial prune operation. +class PruneCrashReportThread : public WorkerThread::Delegate { + public: + //! \brief Constructs a new object. + //! + //! \param[in] database The database to prune crash reports from. + //! \param[in] condition The condition used to evaluate crash reports for + //! pruning. + PruneCrashReportThread(CrashReportDatabase* database, + scoped_ptr condition); + ~PruneCrashReportThread(); + + //! \brief Starts a dedicated pruning thread. + //! + //! The thread waits before running the initial prune, so as to not interfere + //! with any startup-related IO performed by the client. + //! + //! This method may only be be called on a newly-constructed object or after + //! a call to Stop(). + void Start(); + + //! \brief Stops the pruning thread. + //! + //! This method must only be called after Start(). If Start() has been called, + //! this method must be called before destroying an object of this class. + //! + //! This method may be called from any thread other than the pruning thread. + //! It is expected to only be called from the same thread that called Start(). + void Stop(); + + private: + // WorkerThread::Delegate: + void DoWork(const WorkerThread* thread) override; + + WorkerThread thread_; + scoped_ptr condition_; + CrashReportDatabase* database_; // weak + + DISALLOW_COPY_AND_ASSIGN(PruneCrashReportThread); +}; + +} // namespace crashpad + +#endif // CRASHPAD_HANDLER_PRUNE_CRASH_REPORTS_THREAD_H_