After the introduction of the Fair I/O Queueing mechanism in Seastar, it is possible to add requests to a specific priority class, that will end up being serviced fairly. This patch introduces a Priority Manager service, that manages the priority each class of request will get. At this moment, having a class for that may sound like an overkill. However, the most interesting feature of the Fair I/O queue comes from being able to adjust the priorities dynamically as workloads changes: so we will benefit from having them all in the same place. This is designed to behave like one of our services, with the exception that it won't use the distributed interface. This is mainly because there is no reason to introduce that complexity at this point - since we can do thread local registration as we have been doing in Seastar, and because that would require us to change most of our tests to start a new service. Signed-off-by: Glauber Costa <glauber@scylladb.com>
95 lines
2.8 KiB
C++
95 lines
2.8 KiB
C++
/*
|
|
* Copyright 2016 ScyllaDB
|
|
*/
|
|
/*
|
|
* This file is part of Scylla.
|
|
*
|
|
* Scylla is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* Scylla is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with Scylla. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#include <seastar/core/future.hh>
|
|
#include <seastar/core/distributed.hh>
|
|
#include <seastar/core/reactor.hh>
|
|
|
|
namespace service {
|
|
class priority_manager {
|
|
::io_priority_class _commitlog_priority;
|
|
::io_priority_class _mt_flush_priority;
|
|
::io_priority_class _mut_stream_priority;
|
|
::io_priority_class _sstable_query_read;
|
|
::io_priority_class _compaction_priority;
|
|
|
|
public:
|
|
const ::io_priority_class&
|
|
commitlog_priority() {
|
|
return _commitlog_priority;
|
|
}
|
|
|
|
const ::io_priority_class&
|
|
memtable_flush_priority() {
|
|
return _mt_flush_priority;
|
|
}
|
|
|
|
const ::io_priority_class&
|
|
mutation_stream_priority() {
|
|
return _mut_stream_priority;
|
|
}
|
|
|
|
const ::io_priority_class&
|
|
sstable_query_read_priority() {
|
|
return _sstable_query_read;
|
|
}
|
|
|
|
const ::io_priority_class&
|
|
compaction_priority() {
|
|
return _compaction_priority;
|
|
}
|
|
|
|
priority_manager()
|
|
: _commitlog_priority(engine().register_one_priority_class("commitlog", 100))
|
|
, _mt_flush_priority(engine().register_one_priority_class("memtable_flush", 100))
|
|
, _mut_stream_priority(engine().register_one_priority_class("streaming", 100))
|
|
, _sstable_query_read(engine().register_one_priority_class("query", 100))
|
|
, _compaction_priority(engine().register_one_priority_class("compaction", 100))
|
|
|
|
{}
|
|
};
|
|
|
|
priority_manager& get_local_priority_manager();
|
|
const inline ::io_priority_class&
|
|
get_local_commitlog_priority() {
|
|
return get_local_priority_manager().commitlog_priority();
|
|
}
|
|
|
|
const inline ::io_priority_class&
|
|
get_local_memtable_flush_priority() {
|
|
return get_local_priority_manager().memtable_flush_priority();
|
|
}
|
|
|
|
const inline ::io_priority_class&
|
|
get_local_mutation_stream_priority() {
|
|
return get_local_priority_manager().mutation_stream_priority();
|
|
}
|
|
|
|
const inline ::io_priority_class&
|
|
get_local_sstable_query_read_priority() {
|
|
return get_local_priority_manager().sstable_query_read_priority();
|
|
}
|
|
|
|
const inline ::io_priority_class&
|
|
get_local_compaction_priority() {
|
|
return get_local_priority_manager().compaction_priority();
|
|
}
|
|
}
|