unlock();
}
-void ImageWatcher::finalize_header_update() {
- librbd::notify_change(m_image_ctx.md_ctx, m_image_ctx.header_oid,
- &m_image_ctx);
-}
-
void ImageWatcher::assert_header_locked(librados::ObjectWriteOperation *op) {
rados::cls::lock::assert_locked(op, RBD_LOCK_NAME, LOCK_EXCLUSIVE,
encode_lock_cookie(), WATCHER_LOCK_TAG);
int r = librbd::snap_create(&m_image_ctx, payload.snap_name.c_str(), false);
::encode(ResponseMessage(r), *out);
- if (r == 0) {
- // increment now to avoid race due to the delayed notification
- Mutex::Locker lictx(m_image_ctx.refresh_lock);
- ++m_image_ctx.refresh_seq;
-
- // cannot notify within a notificiation
- FunctionContext *ctx = new FunctionContext(
- boost::bind(&ImageWatcher::finalize_header_update, this));
- m_task_finisher->queue(TASK_CODE_HEADER_UPDATE, ctx);
- }
}
}
TASK_CODE_RELEASED_LOCK,
TASK_CODE_RETRY_AIO_REQUESTS,
TASK_CODE_CANCEL_ASYNC_REQUESTS,
- TASK_CODE_HEADER_UPDATE,
TASK_CODE_REREGISTER_WATCH,
TASK_CODE_ASYNC_REQUEST,
TASK_CODE_ASYNC_PROGRESS
int lock();
void release_lock();
bool try_request_lock();
- void finalize_header_update();
void schedule_retry_aio_requests(bool use_timer);
void retry_aio_requests();
}
r = ictx->image_watcher->notify_snap_create(snap_name);
- if (r == -EEXIST) {
+ if (r == 0 || r == -EEXIST) {
+ notify_change(ictx->md_ctx, ictx->header_oid, ictx);
return 0;
} else if (r != -ETIMEDOUT) {
return r;