m_cond.WaitInterval(g_ceph_context, m_lock, seconds(30));
}
- m_image_deleter.reset();
-
ImageIds empty_sources;
while (true) {
Mutex::Locker l(m_lock);
dout(20) << "starting image replayer for "
<< it->second->get_global_image_id() << dendl;
}
- start_image_replayer(it->second, image_id.name);
+ start_image_replayer(it->second, image_id.id, image_id.name);
}
}
}
void Replayer::start_image_replayer(unique_ptr<ImageReplayer<> > &image_replayer,
+ const std::string &image_id,
const boost::optional<std::string>& image_name)
{
+ assert(m_lock.is_locked());
dout(20) << "global_image_id=" << image_replayer->get_global_image_id()
<< dendl;
if (image_name) {
FunctionContext *ctx = new FunctionContext(
- [&] (int r) {
- if (r == -ESTALE) {
+ [this, image_id, image_name] (int r) {
+ if (r == -ESTALE || r == -ECANCELED) {
+ return;
+ }
+
+ Mutex::Locker locker(m_lock);
+ auto it = m_image_replayers.find(image_id);
+ if (it == m_image_replayers.end()) {
return;
}
+ auto &image_replayer = it->second;
if (r >= 0) {
image_replayer->start();
} else {
- start_image_replayer(image_replayer, image_name);
+ start_image_replayer(image_replayer, image_id, image_name);
}
}
);
bool Replayer::stop_image_replayer(unique_ptr<ImageReplayer<> > &image_replayer)
{
+ assert(m_lock.is_locked());
dout(20) << "global_image_id=" << image_replayer->get_global_image_id()
<< dendl;
if (image_replayer->is_stopped()) {
- if (m_image_deleter) {
+ m_image_deleter->cancel_waiter(image_replayer->get_local_image_name());
+ if (!m_stopping.read()) {
dout(20) << "scheduling delete" << dendl;
m_image_deleter->schedule_image_delete(
image_replayer->get_local_pool_id(),
}
if (image_replayer->is_running()) {
- if (m_image_deleter) {
+ if (!m_stopping.read()) {
dout(20) << "scheduling delete after image replayer stopped" << dendl;
}
FunctionContext *ctx = new FunctionContext(
[&image_replayer, this] (int r) {
- if (m_image_deleter) {
+ if (!m_stopping.read()) {
m_image_deleter->schedule_image_delete(
- image_replayer->get_local_pool_id(),
- image_replayer->get_local_image_id(),
- image_replayer->get_local_image_name(),
- image_replayer->get_global_image_id());
+ image_replayer->get_local_pool_id(),
+ image_replayer->get_local_image_id(),
+ image_replayer->get_local_image_name(),
+ image_replayer->get_global_image_id());
}
}
);