1
0
mirror of https://github.com/Zygo/bees.git synced 2025-05-17 05:15:45 +02:00

context: get rid of all instances of pthread_cancel

pthread_cancel doesn't really work properly.  It was only being used in
bees to bring threads to a stop if the BeesContext is destroyed early.
It is frequently implicated in core dump reports because of the fragility
of the C++ iostream / C stdio / library infrastructure, particularly
surrounding upgrades on the host running bees.  The pthread_cancel call
itself often simply fails even when it doesn't call terminate().

Defer creation of the status and progress threads until after the
BeesContext::start method is invoked.  At that point, the existing
ask-threads-nicely-to-stop code is up and running, and normal condvars
can be used to bring bees to a stop, without having to resort to
pthread_cancel.

Since we're deleting half of the BeesContext constructor in this change,
let's remove the other half too, and put an end to the deprecated support
for multiple BeesContexts sharing a process.  It's still possible to run
multiple BeesContexts, but they will not share a FD cache.  This will
allow the FD cache's keys to become smaller and hopefully save some
memory later on.

Fixes: #171

Signed-off-by: Zygo Blaxell <bees@furryterror.org>
This commit is contained in:
Zygo Blaxell 2021-04-28 21:10:55 -04:00
parent 243480b515
commit db65031c2b
3 changed files with 14 additions and 26 deletions

View File

@ -178,22 +178,6 @@ BeesContext::home_fd()
return m_home_fd;
}
BeesContext::BeesContext(shared_ptr<BeesContext> parent) :
m_parent_ctx(parent),
m_progress_thread("progress_report"),
m_status_thread("status_report")
{
if (m_parent_ctx) {
m_fd_cache = m_parent_ctx->fd_cache();
}
m_progress_thread.exec([=]() {
show_progress();
});
m_status_thread.exec([=]() {
dump_status();
});
}
bool
BeesContext::is_root_ro(uint64_t root)
{
@ -962,6 +946,15 @@ BeesContext::start()
BEESLOGNOTICE("Starting bees main loop...");
BEESNOTE("starting BeesContext");
m_progress_thread = make_shared<BeesThread>("progress_report");
m_status_thread = make_shared<BeesThread>("status_report");
m_progress_thread->exec([=]() {
show_progress();
});
m_status_thread->exec([=]() {
dump_status();
});
// Set up temporary file pool
m_tmpfile_pool.generator([=]() -> shared_ptr<BeesTempFile> {
return make_shared<BeesTempFile>(shared_from_this());
@ -1043,7 +1036,7 @@ BeesContext::stop()
BEESNOTE("waiting for progress thread");
BEESLOGDEBUG("Waiting for progress thread");
m_progress_thread.join();
m_progress_thread->join();
// XXX: nobody can see this BEESNOTE because we are killing the
// thread that publishes it
@ -1053,7 +1046,7 @@ BeesContext::stop()
m_stop_status = true;
m_stop_condvar.notify_all();
lock.unlock();
m_status_thread.join();
m_status_thread->join();
BEESLOGNOTICE("bees stopped in " << stop_timer << " sec");
}

View File

@ -70,11 +70,6 @@ BeesThread::~BeesThread()
BEESLOGDEBUG("BeesThread destructor " << m_name);
if (m_thread_ptr->joinable()) {
BEESLOGDEBUG("Cancelling thread " << m_name);
int rv = pthread_cancel(m_thread_ptr->native_handle());
if (rv) {
BEESLOGDEBUG("pthread_cancel returned " << strerror(-rv));
}
BEESLOGDEBUG("Waiting for thread " << m_name);
Timer thread_time;
m_thread_ptr->join();

View File

@ -751,8 +751,8 @@ class BeesContext : public enable_shared_from_this<BeesContext> {
condition_variable m_abort_condvar;
bool m_abort_requested = false;
BeesThread m_progress_thread;
BeesThread m_status_thread;
shared_ptr<BeesThread> m_progress_thread;
shared_ptr<BeesThread> m_status_thread;
void set_root_fd(Fd fd);
@ -763,7 +763,7 @@ class BeesContext : public enable_shared_from_this<BeesContext> {
void rewrite_file_range(const BeesFileRange &bfr);
public:
BeesContext(shared_ptr<BeesContext> parent_ctx = nullptr);
BeesContext() = default;
void set_root_path(string path);