}
template <typename I>
-void ImageRequestWQ<I>::handle_throttle_ready(int r, ImageDispatchSpec<I> *item, uint64_t flag) {
+void ImageRequestWQ<I>::handle_throttle_ready(int r, ImageDispatchSpec<I> *item,
+ uint64_t flag) {
CephContext *cct = m_image_ctx.cct;
ldout(cct, 15) << "r=" << r << ", " << "req=" << item << dendl;
+ std::lock_guard pool_locker{this->get_pool_lock()};
ceph_assert(m_io_throttled.load() > 0);
item->set_throttled(flag);
if (item->were_all_throttled()) {
- this->requeue_back(item);
+ this->requeue_back(pool_locker, item);
--m_io_throttled;
- this->signal();
+ this->signal(pool_locker);
}
}
template <typename I>
-bool ImageRequestWQ<I>::needs_throttle(ImageDispatchSpec<I> *item) {
+bool ImageRequestWQ<I>::needs_throttle(ImageDispatchSpec<I> *item) {
uint64_t tokens = 0;
uint64_t flag = 0;
bool blocked = false;
MOCK_METHOD0(empty, bool());
MOCK_METHOD0(mock_empty, bool());
MOCK_METHOD0(signal, void());
+ MOCK_METHOD1(signal, void(const std::lock_guard<ceph::mutex>&));
MOCK_METHOD0(process_finish, void());
MOCK_METHOD0(front, ImageDispatchSpec*());
MOCK_METHOD1(requeue_front, void(ImageDispatchSpec*));
- MOCK_METHOD1(requeue_back, void(ImageDispatchSpec*));
+ MOCK_METHOD2(requeue_back, void(const std::lock_guard<ceph::mutex>&,
+ ImageDispatchSpec*));
MOCK_METHOD0(dequeue, void*());
MOCK_METHOD1(queue, void(ImageDispatchSpec*));
EXPECT_CALL(image_request_wq, signal());
}
+ void expect_signal_locked(MockImageRequestWQ &image_request_wq) {
+ EXPECT_CALL(image_request_wq, signal(_));
+ }
+
void expect_queue(MockImageRequestWQ &image_request_wq) {
EXPECT_CALL(image_request_wq, queue(_));
}
void expect_requeue_back(MockImageRequestWQ &image_request_wq) {
- EXPECT_CALL(image_request_wq, requeue_back(_));
+ EXPECT_CALL(image_request_wq, requeue_back(_, _));
}
void expect_front(MockImageRequestWQ &image_request_wq,
expect_dequeue(mock_image_request_wq, &mock_queued_image_request);
expect_all_throttled(mock_queued_image_request, true);
expect_requeue_back(mock_image_request_wq);
- expect_signal(mock_image_request_wq);
+ expect_signal_locked(mock_image_request_wq);
ASSERT_TRUE(mock_image_request_wq.invoke_dequeue() == nullptr);
}
expect_dequeue(mock_image_request_wq, &mock_queued_image_request);
expect_all_throttled(mock_queued_image_request, true);
expect_requeue_back(mock_image_request_wq);
- expect_signal(mock_image_request_wq);
+ expect_signal_locked(mock_image_request_wq);
ASSERT_TRUE(mock_image_request_wq.invoke_dequeue() == nullptr);
}