}
RWLock::RLocker l(m_image_ctx.owner_lock);
- if (m_image_ctx.exclusive_lock != nullptr &&
- m_image_ctx.exclusive_lock->accept_requests()) {
- // need to send something back so the client can detect a missing leader
- ::encode(ResponseMessage(0), ack_ctx->out);
-
- {
- Mutex::Locker owner_client_id_locker(m_owner_client_id_lock);
- if (!m_owner_client_id.is_valid()) {
- return true;
+ if (m_image_ctx.exclusive_lock != nullptr) {
+ int r;
+ if (m_image_ctx.exclusive_lock->accept_requests(&r)) {
+ // need to send something back so the client can detect a missing leader
+ ::encode(ResponseMessage(0), ack_ctx->out);
+
+ {
+ Mutex::Locker owner_client_id_locker(m_owner_client_id_lock);
+ if (!m_owner_client_id.is_valid()) {
+ return true;
+ }
}
- }
- ldout(m_image_ctx.cct, 10) << this << " queuing release of exclusive lock"
- << dendl;
- m_image_ctx.get_exclusive_lock_policy()->lock_requested(payload.force);
+ ldout(m_image_ctx.cct, 10) << this << " queuing release of exclusive lock"
+ << dendl;
+ m_image_ctx.get_exclusive_lock_policy()->lock_requested(payload.force);
+ } else if (r < 0) {
+ ::encode(ResponseMessage(r), ack_ctx->out);
+ }
}
return true;
}
C_NotifyAck *ack_ctx) {
RWLock::RLocker l(m_image_ctx.owner_lock);
- if (m_image_ctx.exclusive_lock != nullptr &&
- m_image_ctx.exclusive_lock->accept_requests()) {
- bool new_request;
- Context *ctx;
- ProgressContext *prog_ctx;
- int r = prepare_async_request(payload.async_request_id, &new_request,
- &ctx, &prog_ctx);
- if (new_request) {
- ldout(m_image_ctx.cct, 10) << this << " remote flatten request: "
- << payload.async_request_id << dendl;
- m_image_ctx.operations->execute_flatten(*prog_ctx, ctx);
- }
+ if (m_image_ctx.exclusive_lock != nullptr) {
+ int r;
+ if (m_image_ctx.exclusive_lock->accept_requests(&r)) {
+ bool new_request;
+ Context *ctx;
+ ProgressContext *prog_ctx;
+ r = prepare_async_request(payload.async_request_id, &new_request,
+ &ctx, &prog_ctx);
+ if (new_request) {
+ ldout(m_image_ctx.cct, 10) << this << " remote flatten request: "
+ << payload.async_request_id << dendl;
+ m_image_ctx.operations->execute_flatten(*prog_ctx, ctx);
+ }
- ::encode(ResponseMessage(r), ack_ctx->out);
+ ::encode(ResponseMessage(r), ack_ctx->out);
+ } else if (r < 0) {
+ ::encode(ResponseMessage(r), ack_ctx->out);
+ }
}
return true;
}
bool ImageWatcher::handle_payload(const ResizePayload &payload,
C_NotifyAck *ack_ctx) {
RWLock::RLocker l(m_image_ctx.owner_lock);
- if (m_image_ctx.exclusive_lock != nullptr &&
- m_image_ctx.exclusive_lock->accept_requests()) {
- bool new_request;
- Context *ctx;
- ProgressContext *prog_ctx;
- int r = prepare_async_request(payload.async_request_id, &new_request,
- &ctx, &prog_ctx);
- if (new_request) {
- ldout(m_image_ctx.cct, 10) << this << " remote resize request: "
- << payload.async_request_id << " "
- << payload.size << dendl;
- m_image_ctx.operations->execute_resize(payload.size, *prog_ctx, ctx, 0);
- }
+ if (m_image_ctx.exclusive_lock != nullptr) {
+ int r;
+ if (m_image_ctx.exclusive_lock->accept_requests(&r)) {
+ bool new_request;
+ Context *ctx;
+ ProgressContext *prog_ctx;
+ r = prepare_async_request(payload.async_request_id, &new_request,
+ &ctx, &prog_ctx);
+ if (new_request) {
+ ldout(m_image_ctx.cct, 10) << this << " remote resize request: "
+ << payload.async_request_id << " "
+ << payload.size << dendl;
+ m_image_ctx.operations->execute_resize(payload.size, *prog_ctx, ctx, 0);
+ }
- ::encode(ResponseMessage(r), ack_ctx->out);
+ ::encode(ResponseMessage(r), ack_ctx->out);
+ } else if (r < 0) {
+ ::encode(ResponseMessage(r), ack_ctx->out);
+ }
}
return true;
}
bool ImageWatcher::handle_payload(const SnapCreatePayload &payload,
C_NotifyAck *ack_ctx) {
RWLock::RLocker l(m_image_ctx.owner_lock);
- if (m_image_ctx.exclusive_lock != nullptr &&
- m_image_ctx.exclusive_lock->accept_requests()) {
- ldout(m_image_ctx.cct, 10) << this << " remote snap_create request: "
- << payload.snap_name << dendl;
-
- m_image_ctx.operations->execute_snap_create(payload.snap_name.c_str(),
- new C_ResponseMessage(ack_ctx),
- 0, false);
- return false;
+ if (m_image_ctx.exclusive_lock != nullptr) {
+ int r;
+ if (m_image_ctx.exclusive_lock->accept_requests(&r)) {
+ ldout(m_image_ctx.cct, 10) << this << " remote snap_create request: "
+ << payload.snap_name << dendl;
+
+ m_image_ctx.operations->execute_snap_create(payload.snap_name.c_str(),
+ new C_ResponseMessage(ack_ctx),
+ 0, false);
+ return false;
+ } else if (r < 0) {
+ ::encode(ResponseMessage(r), ack_ctx->out);
+ }
}
return true;
}
bool ImageWatcher::handle_payload(const SnapRenamePayload &payload,
C_NotifyAck *ack_ctx) {
RWLock::RLocker l(m_image_ctx.owner_lock);
- if (m_image_ctx.exclusive_lock != nullptr &&
- m_image_ctx.exclusive_lock->accept_requests()) {
- ldout(m_image_ctx.cct, 10) << this << " remote snap_rename request: "
- << payload.snap_id << " to "
- << payload.snap_name << dendl;
-
- m_image_ctx.operations->execute_snap_rename(payload.snap_id,
- payload.snap_name.c_str(),
- new C_ResponseMessage(ack_ctx));
- return false;
+ if (m_image_ctx.exclusive_lock != nullptr) {
+ int r;
+ if (m_image_ctx.exclusive_lock->accept_requests(&r)) {
+ ldout(m_image_ctx.cct, 10) << this << " remote snap_rename request: "
+ << payload.snap_id << " to "
+ << payload.snap_name << dendl;
+
+ m_image_ctx.operations->execute_snap_rename(payload.snap_id,
+ payload.snap_name.c_str(),
+ new C_ResponseMessage(ack_ctx));
+ return false;
+ } else if (r < 0) {
+ ::encode(ResponseMessage(r), ack_ctx->out);
+ }
}
return true;
}
bool ImageWatcher::handle_payload(const SnapRemovePayload &payload,
C_NotifyAck *ack_ctx) {
RWLock::RLocker l(m_image_ctx.owner_lock);
- if (m_image_ctx.exclusive_lock != nullptr &&
- m_image_ctx.exclusive_lock->accept_requests()) {
- ldout(m_image_ctx.cct, 10) << this << " remote snap_remove request: "
- << payload.snap_name << dendl;
-
- m_image_ctx.operations->execute_snap_remove(payload.snap_name.c_str(),
- new C_ResponseMessage(ack_ctx));
- return false;
+ if (m_image_ctx.exclusive_lock != nullptr) {
+ int r;
+ if (m_image_ctx.exclusive_lock->accept_requests(&r)) {
+ ldout(m_image_ctx.cct, 10) << this << " remote snap_remove request: "
+ << payload.snap_name << dendl;
+
+ m_image_ctx.operations->execute_snap_remove(payload.snap_name.c_str(),
+ new C_ResponseMessage(ack_ctx));
+ return false;
+ } else if (r < 0) {
+ ::encode(ResponseMessage(r), ack_ctx->out);
+ }
}
return true;
}
bool ImageWatcher::handle_payload(const SnapProtectPayload& payload,
C_NotifyAck *ack_ctx) {
RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
- if (m_image_ctx.exclusive_lock != nullptr &&
- m_image_ctx.exclusive_lock->accept_requests()) {
- ldout(m_image_ctx.cct, 10) << this << " remote snap_protect request: "
- << payload.snap_name << dendl;
+ if (m_image_ctx.exclusive_lock != nullptr) {
+ int r;
+ if (m_image_ctx.exclusive_lock->accept_requests(&r)) {
+ ldout(m_image_ctx.cct, 10) << this << " remote snap_protect request: "
+ << payload.snap_name << dendl;
- m_image_ctx.operations->execute_snap_protect(payload.snap_name.c_str(),
- new C_ResponseMessage(ack_ctx));
- return false;
+ m_image_ctx.operations->execute_snap_protect(payload.snap_name.c_str(),
+ new C_ResponseMessage(ack_ctx));
+ return false;
+ } else if (r < 0) {
+ ::encode(ResponseMessage(r), ack_ctx->out);
+ }
}
return true;
}
bool ImageWatcher::handle_payload(const SnapUnprotectPayload& payload,
C_NotifyAck *ack_ctx) {
RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
- if (m_image_ctx.exclusive_lock != nullptr &&
- m_image_ctx.exclusive_lock->accept_requests()) {
- ldout(m_image_ctx.cct, 10) << this << " remote snap_unprotect request: "
- << payload.snap_name << dendl;
-
- m_image_ctx.operations->execute_snap_unprotect(payload.snap_name.c_str(),
- new C_ResponseMessage(ack_ctx));
- return false;
+ if (m_image_ctx.exclusive_lock != nullptr) {
+ int r;
+ if (m_image_ctx.exclusive_lock->accept_requests(&r)) {
+ ldout(m_image_ctx.cct, 10) << this << " remote snap_unprotect request: "
+ << payload.snap_name << dendl;
+
+ m_image_ctx.operations->execute_snap_unprotect(payload.snap_name.c_str(),
+ new C_ResponseMessage(ack_ctx));
+ return false;
+ } else if (r < 0) {
+ ::encode(ResponseMessage(r), ack_ctx->out);
+ }
}
return true;
}
bool ImageWatcher::handle_payload(const RebuildObjectMapPayload& payload,
C_NotifyAck *ack_ctx) {
RWLock::RLocker l(m_image_ctx.owner_lock);
- if (m_image_ctx.exclusive_lock != nullptr &&
- m_image_ctx.exclusive_lock->accept_requests()) {
- bool new_request;
- Context *ctx;
- ProgressContext *prog_ctx;
- int r = prepare_async_request(payload.async_request_id, &new_request,
- &ctx, &prog_ctx);
- if (new_request) {
- ldout(m_image_ctx.cct, 10) << this
- << " remote rebuild object map request: "
- << payload.async_request_id << dendl;
- m_image_ctx.operations->execute_rebuild_object_map(*prog_ctx, ctx);
- }
+ if (m_image_ctx.exclusive_lock != nullptr) {
+ int r;
+ if (m_image_ctx.exclusive_lock->accept_requests(&r)) {
+ bool new_request;
+ Context *ctx;
+ ProgressContext *prog_ctx;
+ r = prepare_async_request(payload.async_request_id, &new_request,
+ &ctx, &prog_ctx);
+ if (new_request) {
+ ldout(m_image_ctx.cct, 10) << this
+ << " remote rebuild object map request: "
+ << payload.async_request_id << dendl;
+ m_image_ctx.operations->execute_rebuild_object_map(*prog_ctx, ctx);
+ }
- ::encode(ResponseMessage(r), ack_ctx->out);
+ ::encode(ResponseMessage(r), ack_ctx->out);
+ } else if (r < 0) {
+ ::encode(ResponseMessage(r), ack_ctx->out);
+ }
}
return true;
}
bool ImageWatcher::handle_payload(const RenamePayload& payload,
C_NotifyAck *ack_ctx) {
RWLock::RLocker owner_locker(m_image_ctx.owner_lock);
- if (m_image_ctx.exclusive_lock != nullptr &&
- m_image_ctx.exclusive_lock->accept_requests()) {
- ldout(m_image_ctx.cct, 10) << this << " remote rename request: "
- << payload.image_name << dendl;
-
- m_image_ctx.operations->execute_rename(payload.image_name.c_str(),
- new C_ResponseMessage(ack_ctx));
- return false;
+ if (m_image_ctx.exclusive_lock != nullptr) {
+ int r;
+ if (m_image_ctx.exclusive_lock->accept_requests(&r)) {
+ ldout(m_image_ctx.cct, 10) << this << " remote rename request: "
+ << payload.image_name << dendl;
+
+ m_image_ctx.operations->execute_rename(payload.image_name.c_str(),
+ new C_ResponseMessage(ack_ctx));
+ return false;
+ } else if (r < 0) {
+ ::encode(ResponseMessage(r), ack_ctx->out);
+ }
}
return true;
}
bool ImageWatcher::handle_payload(const UnknownPayload &payload,
C_NotifyAck *ack_ctx) {
RWLock::RLocker l(m_image_ctx.owner_lock);
- if (m_image_ctx.exclusive_lock != nullptr &&
- m_image_ctx.exclusive_lock->accept_requests()) {
- ::encode(ResponseMessage(-EOPNOTSUPP), ack_ctx->out);
+ if (m_image_ctx.exclusive_lock != nullptr) {
+ int r;
+ if (m_image_ctx.exclusive_lock->accept_requests(&r) || r < 0) {
+ ::encode(ResponseMessage(-EOPNOTSUPP), ack_ctx->out);
+ }
}
return true;
}