}
JournalTrimmer::~JournalTrimmer() {
+ assert(m_shutdown);
+}
+
+void JournalTrimmer::shut_down(Context *on_finish) {
+ ldout(m_cct, 20) << __func__ << dendl;
+ {
+ Mutex::Locker locker(m_lock);
+ assert(!m_shutdown);
+ m_shutdown = true;
+ }
+
m_journal_metadata->remove_listener(&m_metadata_listener);
- m_journal_metadata->flush_commit_position();
- m_async_op_tracker.wait_for_ops();
+ // chain the shut down sequence (reverse order)
+ on_finish = new FunctionContext([this, on_finish](int r) {
+ m_async_op_tracker.wait_for_ops(on_finish);
+ });
+ m_journal_metadata->flush_commit_position(on_finish);
}
int JournalTrimmer::remove_objects(bool force) {
#include "cls/journal/cls_journal_types.h"
#include <functional>
+struct Context;
+
namespace journal {
class JournalTrimmer {
const JournalMetadataPtr &journal_metadata);
~JournalTrimmer();
+ void shut_down(Context *on_finish);
+
int remove_objects(bool force);
void committed(uint64_t commit_tid);
uint64_t m_remove_set;
Context *m_remove_set_ctx;
+ bool m_shutdown = false;
+
CreateContext m_create_commit_position_safe_context = [this]() {
return new C_CommitPositionSafe(this);
};
m_metadata->put();
m_metadata = nullptr;
}
- delete m_trimmer;
+
+ // TODO
+ if (m_trimmer != nullptr) {
+ C_SaferCond ctx;
+ m_trimmer->shut_down(&ctx);
+ ctx.wait();
+ delete m_trimmer;
+ }
assert(m_player == nullptr);
assert(m_recorder == nullptr);
for (std::list<journal::JournalTrimmer*>::iterator it = m_trimmers.begin();
it != m_trimmers.end(); ++it) {
+ C_SaferCond ctx;
+ (*it)->shut_down(&ctx);
+ ASSERT_EQ(0, ctx.wait());
delete *it;
}
RadosTestFixture::TearDown();