virtual ~AsyncRequest();
void complete(int r) {
- if (m_canceled && safely_cancel(r)) {
- m_on_finish->complete(-ERESTART);
- delete this;
- } else if (should_complete(r)) {
+ if (should_complete(r)) {
m_on_finish->complete(filter_return_code(r));
delete this;
}
void async_complete(int r);
- virtual bool safely_cancel(int r) {
- return true;
- }
virtual bool should_complete(int r) = 0;
virtual int filter_return_code(int r) {
return r;
protected:
const uint64_t m_snap_id;
- virtual bool safely_cancel(int r) {
- return false;
- }
virtual bool should_complete(int r);
virtual int filter_return_code(int r) {
// never propagate an error back to the caller
}
}
-bool ResizeRequest::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 ResizeRequest::should_complete(int r) {
CephContext *cct = m_image_ctx.cct;
ldout(cct, 5) << this << " should_complete: " << " r=" << r << dendl;
xlist<ResizeRequest *>::item m_xlist_item;
- virtual bool safely_cancel(int r);
virtual bool should_complete(int r);
void send_flush();