1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 * Ceph - scalable distributed file system
6 * Copyright (C) 2016 Red Hat Inc.
8 * This is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License version 2.1, as published by the Free Software
11 * Foundation. See file COPYING.
18 #include "osd/mClockOpClassQueue.h"
19 #include "common/dout.h"
22 namespace dmc = crimson::dmclock;
25 #define dout_context cct
26 #define dout_subsys ceph_subsys_osd
28 #define dout_prefix *_dout
33 mClockOpClassQueue::mclock_op_tags_t::mclock_op_tags_t(CephContext *cct) :
34 client_op(cct->_conf->osd_op_queue_mclock_client_op_res,
35 cct->_conf->osd_op_queue_mclock_client_op_wgt,
36 cct->_conf->osd_op_queue_mclock_client_op_lim),
37 osd_subop(cct->_conf->osd_op_queue_mclock_osd_subop_res,
38 cct->_conf->osd_op_queue_mclock_osd_subop_wgt,
39 cct->_conf->osd_op_queue_mclock_osd_subop_lim),
40 snaptrim(cct->_conf->osd_op_queue_mclock_snap_res,
41 cct->_conf->osd_op_queue_mclock_snap_wgt,
42 cct->_conf->osd_op_queue_mclock_snap_lim),
43 recov(cct->_conf->osd_op_queue_mclock_recov_res,
44 cct->_conf->osd_op_queue_mclock_recov_wgt,
45 cct->_conf->osd_op_queue_mclock_recov_lim),
46 scrub(cct->_conf->osd_op_queue_mclock_scrub_res,
47 cct->_conf->osd_op_queue_mclock_scrub_wgt,
48 cct->_conf->osd_op_queue_mclock_scrub_lim)
51 "mClockOpClassQueue settings:: " <<
52 "client_op:" << client_op <<
53 "; osd_subop:" << osd_subop <<
54 "; snaptrim:" << snaptrim <<
55 "; recov:" << recov <<
56 "; scrub:" << scrub <<
62 mClockOpClassQueue::op_class_client_info_f(const osd_op_type_t& op_type) {
64 case osd_op_type_t::client_op:
65 return mclock_op_tags->client_op;
66 case osd_op_type_t::osd_subop:
67 return mclock_op_tags->osd_subop;
68 case osd_op_type_t::bg_snaptrim:
69 return mclock_op_tags->snaptrim;
70 case osd_op_type_t::bg_recovery:
71 return mclock_op_tags->recov;
72 case osd_op_type_t::bg_scrub:
73 return mclock_op_tags->scrub;
76 return dmc::ClientInfo(-1, -1, -1);
81 * class mClockOpClassQueue
84 std::unique_ptr<mClockOpClassQueue::mclock_op_tags_t>
85 mClockOpClassQueue::mclock_op_tags(nullptr);
87 mClockOpClassQueue::pg_queueable_visitor_t
88 mClockOpClassQueue::pg_queueable_visitor;
90 mClockOpClassQueue::mClockOpClassQueue(CephContext *cct) :
91 queue(&mClockOpClassQueue::op_class_client_info_f)
93 // manage the singleton
94 if (!mclock_op_tags) {
95 mclock_op_tags.reset(new mclock_op_tags_t(cct));
99 mClockOpClassQueue::osd_op_type_t
100 mClockOpClassQueue::get_osd_op_type(const Request& request) {
102 boost::apply_visitor(pg_queueable_visitor, request.second.get_variant());
104 // if we got client_op back then we need to distinguish between
105 // a client op and an osd subop.
107 if (osd_op_type_t::client_op != type) {
109 } else if (MSG_OSD_SUBOP ==
110 boost::get<OpRequestRef>(
111 request.second.get_variant())->get_req()->get_header().type) {
112 return osd_op_type_t::osd_subop;
114 return osd_op_type_t::client_op;
118 // Formatted output of the queue
119 void mClockOpClassQueue::dump(ceph::Formatter *f) const {