// vim: ts=8 sw=2 smarttab
#include "journal/JournalPlayer.h"
+#include "common/Finisher.h"
#include "journal/ReplayHandler.h"
#include "journal/Utils.h"
namespace journal {
+namespace {
+
+struct C_HandleComplete: public Context {
+ ReplayHandler *replay_handler;
+
+ C_HandleComplete(ReplayHandler *_replay_handler)
+ : replay_handler(_replay_handler) {
+ }
+
+ virtual void finish(int r) {
+ replay_handler->handle_complete(r);
+ }
+};
+
+} // anonymous namespace
+
JournalPlayer::JournalPlayer(librados::IoCtx &ioctx,
const std::string &object_oid_prefix,
const JournalMetadataPtr& journal_metadata,
object_player->watch(&m_process_state, m_watch_interval);
m_watch_scheduled = true;
} else if (!m_watch_enabled && !object_player->is_fetch_in_progress()) {
- m_lock.Unlock();
- m_replay_handler->handle_complete(0);
- m_lock.Lock();
+ m_journal_metadata->get_finisher().queue(new C_HandleComplete(
+ m_replay_handler), 0);
}
return false;
}
lderr(m_cct) << "missing prior journal entry: " << *entry << dendl;
m_state = STATE_ERROR;
- m_lock.Unlock();
- m_replay_handler->handle_complete(-EINVAL);
- m_lock.Lock();
+ m_journal_metadata->get_finisher().queue(new C_HandleComplete(
+ m_replay_handler), -EINVAL);
return false;
}
} else {
ldout(m_cct, 10) << __func__ << ": no uncommitted entries available"
<< dendl;
- m_lock.Unlock();
- m_replay_handler->handle_complete(0);
- m_lock.Lock();
+ m_journal_metadata->get_finisher().queue(new C_HandleComplete(
+ m_replay_handler), 0);
}
return 0;
}