io::DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) override;
- void handle_finished(int r, uint64_t tid) override {
- }
-
private:
typedef std::list<Context*> Contexts;
typedef std::unordered_set<uint64_t> Tids;
DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) override;
- void handle_finished(int r, uint64_t tid) override {}
-
private:
ImageCtxT* m_image_ctx;
DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) = 0;
- virtual void handle_finished(int r, uint64_t tid) = 0;
-
};
} // namespace io
m_write_block_dispatch->wait_on_writes_unblocked(on_unblocked);
}
-template <typename I>
-void ImageDispatcher<I>::finish(int r, ImageDispatchLayer image_dispatch_layer,
- uint64_t tid) {
- auto cct = this->m_image_ctx->cct;
- ldout(cct, 20) << "r=" << r << ", tid=" << tid << dendl;
-
- // loop in reverse order from last invoked dispatch layer calling its
- // handle_finished method
- while (image_dispatch_layer != IMAGE_DISPATCH_LAYER_NONE) {
- std::shared_lock locker{this->m_lock};
- auto it = this->m_dispatches.find(image_dispatch_layer);
- image_dispatch_layer = static_cast<ImageDispatchLayer>(
- image_dispatch_layer - 1);
-
- if (it == this->m_dispatches.end()) {
- continue;
- }
-
- // track callback while lock is dropped so that the layer cannot be shutdown
- auto& dispatch_meta = it->second;
- auto dispatch = dispatch_meta.dispatch;
- auto async_op_tracker = dispatch_meta.async_op_tracker;
- async_op_tracker->start_op();
- locker.unlock();
-
- dispatch->handle_finished(r, tid);
-
- // safe since dispatch_meta cannot be deleted until ops finished
- async_op_tracker->finish_op();
- }
-}
-
template <typename I>
bool ImageDispatcher<I>::send_dispatch(
ImageDispatchInterface* image_dispatch,
void unblock_writes() override;
void wait_on_writes_unblocked(Context *on_unblocked) override;
- void finish(int r, ImageDispatchLayer image_dispatch_layer,
- uint64_t tid) override;
-
protected:
bool send_dispatch(
ImageDispatchInterface* image_dispatch,
virtual void unblock_writes() = 0;
virtual void wait_on_writes_unblocked(Context *on_unblocked) = 0;
-
- virtual void finish(int r, ImageDispatchLayer image_dispatch_layer,
- uint64_t tid) = 0;
};
} // namespace io
DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) override;
- void handle_finished(int r, uint64_t tid) override;
-
private:
ImageCtxT* m_image_ctx;
FlushTracker<ImageCtxT>* m_flush_tracker;
+ void handle_finished(int r, uint64_t tid);
+
bool set_throttle_flag(std::atomic<uint32_t>* image_dispatch_flags,
uint32_t flag);
bool needs_throttle(bool read_op, const Extents& image_extents, uint64_t tid,
DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) override;
- void handle_finished(int r, uint64_t tid) override;
-
private:
ImageCtxT* m_image_ctx;
FlushTracker<ImageCtxT>* m_flush_tracker;
+ void handle_finished(int r, uint64_t tid);
+
bool enqueue(bool read_op, uint64_t tid, DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched);
DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) override;
- void handle_finished(int r, uint64_t tid) override {}
-
private:
ImageCtxT* m_image_ctx;
DispatchResult* dispatch_result, Context** on_finish,
Context* on_dispatched) override;
- void handle_finished(int r, uint64_t tid) override;
-
private:
struct C_BlockedWrites;
Contexts m_write_blocker_contexts;
Contexts m_unblocked_write_waiter_contexts;
+ void handle_finished(int r, uint64_t tid);
+
bool process_io(uint64_t tid, DispatchResult* dispatch_result,
Context** on_finish, Context* on_dispatched);
void flush_io(Context* on_finish);
return false;
}
- void handle_finished(int r, uint64_t tid) override {};
-
};
} // namespace io