const std::string CLIENT_DESCRIPTION = "master image";
+struct C_DestroyJournaler : public Context {
+ ::journal::Journaler *journaler;
+
+ C_DestroyJournaler(::journal::Journaler *_journaler) : journaler(_journaler) {
+ }
+ virtual void finish(int r) {
+ delete journaler;
+ }
+};
+
} // anonymous namespace
Journal::Journal(ImageCtx &image_ctx)
assert(m_lock.is_locked());
m_close_pending = false;
- delete m_journaler;
+ m_image_ctx.op_work_queue->queue(new C_DestroyJournaler(m_journaler), 0);
m_journaler = NULL;
+
transition_state(STATE_UNINITIALIZED);
}
ldout(cct, 20) << this << " " << __func__ << dendl;
Mutex::Locker locker(m_lock);
+ if (m_state != STATE_REPLAYING) {
+ return;
+ }
+
while (true) {
if (m_close_pending) {
m_journaler->stop_replay();
{
Mutex::Locker locker(m_lock);
+ if (m_state != STATE_REPLAYING) {
+ return;
+ }
+
if (r < 0) {
lderr(cct) << this << " " << __func__ << ": r=" << r << dendl;
} else if (!lock_owner && m_state != STATE_UNINITIALIZED) {
assert(m_state == STATE_RECORDING);
assert(m_events.empty());
+
int r = stop_recording();
if (r < 0) {
// TODO handle failed journal writes
}
int Journal::stop_recording() {
- C_SaferCond cond;
+ assert(m_lock.is_locked());
+ assert(m_journaler != NULL);
+ C_SaferCond cond;
m_journaler->stop_append(&cond);
m_lock.Unlock();