virtual ~AsyncRequest();
void complete(int r) {
- if (m_canceled) {
+ if (m_canceled && safely_cancel(r)) {
m_on_finish->complete(-ERESTART);
delete this;
} else if (should_complete(r)) {
librados::AioCompletion *create_callback_completion();
Context *create_callback_context();
+ virtual bool safely_cancel(int r) {
+ return true;
+ }
virtual bool should_complete(int r) = 0;
private:
}
}
+bool AsyncResizeRequest::safely_cancel(int r) {
+ CephContext *cct = m_image_ctx.cct;
+ ldout(cct, 5) << this << " safely_cancel: " << " r=" << r << dendl;
+
+ // avoid interrupting the object map / header updates
+ switch (m_state) {
+ case STATE_GROW_OBJECT_MAP:
+ case STATE_UPDATE_HEADER:
+ case STATE_SHRINK_OBJECT_MAP:
+ ldout(cct, 5) << "delaying cancel request" << dendl;
+ return false;
+ default:
+ break;
+ }
+ return true;
+}
+
bool AsyncResizeRequest::should_complete(int r) {
CephContext *cct = m_image_ctx.cct;
ldout(cct, 5) << this << " should_complete: " << " r=" << r << dendl;