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 .
This commit is contained in:
Robert Sesek 2016-01-05 15:09:00 -05:00
parent 5e24471188
commit 18a2941305
4 changed files with 128 additions and 2 deletions

View File

@ -38,12 +38,14 @@
'sources': [ 'sources': [
'crash_report_upload_thread.cc', 'crash_report_upload_thread.cc',
'crash_report_upload_thread.h', 'crash_report_upload_thread.h',
'handler_main.cc',
'handler_main.h',
'mac/crash_report_exception_handler.cc', 'mac/crash_report_exception_handler.cc',
'mac/crash_report_exception_handler.h', 'mac/crash_report_exception_handler.h',
'mac/exception_handler_server.cc', 'mac/exception_handler_server.cc',
'mac/exception_handler_server.h', 'mac/exception_handler_server.h',
'handler_main.cc', 'prune_crash_reports_thread.cc',
'handler_main.h', 'prune_crash_reports_thread.h',
'win/crash_report_exception_handler.cc', 'win/crash_report_exception_handler.cc',
'win/crash_report_exception_handler.h', 'win/crash_report_exception_handler.h',
], ],

View File

@ -31,8 +31,10 @@
#include "build/build_config.h" #include "build/build_config.h"
#include "client/crash_report_database.h" #include "client/crash_report_database.h"
#include "client/crashpad_client.h" #include "client/crashpad_client.h"
#include "client/prune_crash_reports.h"
#include "tools/tool_support.h" #include "tools/tool_support.h"
#include "handler/crash_report_upload_thread.h" #include "handler/crash_report_upload_thread.h"
#include "handler/prune_crash_reports_thread.h"
#include "util/file/file_io.h" #include "util/file/file_io.h"
#include "util/stdlib/map_insert.h" #include "util/stdlib/map_insert.h"
#include "util/stdlib/string_number_conversion.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); CrashReportUploadThread upload_thread(database.get(), options.url);
upload_thread.Start(); upload_thread.Start();
PruneCrashReportThread prune_thread(database.get(),
PruneCondition::GetDefault());
prune_thread.Start();
CrashReportExceptionHandler exception_handler( CrashReportExceptionHandler exception_handler(
database.get(), &upload_thread, &options.annotations); database.get(), &upload_thread, &options.annotations);
exception_handler_server.Run(&exception_handler); exception_handler_server.Run(&exception_handler);
upload_thread.Stop(); upload_thread.Stop();
prune_thread.Stop();
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }

View File

@ -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<PruneCondition> 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

View File

@ -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<PruneCondition> 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<PruneCondition> condition_;
CrashReportDatabase* database_; // weak
DISALLOW_COPY_AND_ASSIGN(PruneCrashReportThread);
};
} // namespace crashpad
#endif // CRASHPAD_HANDLER_PRUNE_CRASH_REPORTS_THREAD_H_