Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add keepalive_timeout flag #6674

Merged
merged 5 commits into from
Aug 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Unreleased
- Changes from 5.27.1
- Features
- ADDED: Add support for a keepalive_timeout flag. [#6674](https://github.com/Project-OSRM/osrm-backend/pull/6674)
- ADDED: Add support for a default_radius flag. [#6575](https://github.com/Project-OSRM/osrm-backend/pull/6575)
- ADDED: Add support for disabling feature datasets. [#6666](https://github.com/Project-OSRM/osrm-backend/pull/6666)
- Build:
Expand Down
3 changes: 3 additions & 0 deletions features/options/routed/help.feature
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ Feature: osrm-routed command line options: help
And stdout should contain "--max-table-size"
And stdout should contain "--max-matching-size"
And stdout should contain "--default-radius"
And stdout should contain "--keepalive-timeout"
And it should exit successfully

Scenario: osrm-routed - Help, short
Expand All @@ -44,6 +45,7 @@ Feature: osrm-routed command line options: help
And stdout should contain "--max-table-size"
And stdout should contain "--max-matching-size"
And stdout should contain "--default-radius"
And stdout should contain "--keepalive-timeout"
And it should exit successfully

Scenario: osrm-routed - Help, long
Expand All @@ -65,4 +67,5 @@ Feature: osrm-routed command line options: help
And stdout should contain "--max-table-size"
And stdout should contain "--max-matching-size"
And stdout should contain "--default-radius"
And stdout should contain "--keepalive-timeout"
And it should exit successfully
4 changes: 3 additions & 1 deletion include/server/connection.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@ class RequestHandler;
class Connection : public std::enable_shared_from_this<Connection>
{
public:
explicit Connection(boost::asio::io_context &io_context, RequestHandler &handler);
explicit Connection(boost::asio::io_context &io_context,
RequestHandler &handler,
short keepalive_timeout);
Connection(const Connection &) = delete;
Connection &operator=(const Connection &) = delete;

Expand Down
22 changes: 15 additions & 7 deletions include/server/server.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,24 @@ class Server
{
public:
// Note: returns a shared instead of a unique ptr as it is captured in a lambda somewhere else
static std::shared_ptr<Server>
CreateServer(std::string &ip_address, int ip_port, unsigned requested_num_threads)
static std::shared_ptr<Server> CreateServer(std::string &ip_address,
int ip_port,
unsigned requested_num_threads,
short keepalive_timeout)
{
util::Log() << "http 1.1 compression handled by zlib version " << zlibVersion();
const unsigned hardware_threads = std::max(1u, std::thread::hardware_concurrency());
const unsigned real_num_threads = std::min(hardware_threads, requested_num_threads);
return std::make_shared<Server>(ip_address, ip_port, real_num_threads);
return std::make_shared<Server>(ip_address, ip_port, real_num_threads, keepalive_timeout);
}

explicit Server(const std::string &address, const int port, const unsigned thread_pool_size)
: thread_pool_size(thread_pool_size), acceptor(io_context),
new_connection(std::make_shared<Connection>(io_context, request_handler))
explicit Server(const std::string &address,
const int port,
const unsigned thread_pool_size,
const short keepalive_timeout)
: thread_pool_size(thread_pool_size), keepalive_timeout(keepalive_timeout),
acceptor(io_context), new_connection(std::make_shared<Connection>(
io_context, request_handler, keepalive_timeout))
{
const auto port_string = std::to_string(port);

Expand Down Expand Up @@ -94,7 +100,8 @@ class Server
if (!e)
{
new_connection->start();
new_connection = std::make_shared<Connection>(io_context, request_handler);
new_connection =
std::make_shared<Connection>(io_context, request_handler, keepalive_timeout);
acceptor.async_accept(
new_connection->socket(),
boost::bind(&Server::HandleAccept, this, boost::asio::placeholders::error));
Expand All @@ -107,6 +114,7 @@ class Server

RequestHandler request_handler;
unsigned thread_pool_size;
short keepalive_timeout;
boost::asio::io_context io_context;
boost::asio::ip::tcp::acceptor acceptor;
std::shared_ptr<Connection> new_connection;
Expand Down
11 changes: 8 additions & 3 deletions src/server/connection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,17 @@
#include <boost/iostreams/filter/gzip.hpp>
#include <boost/iostreams/filtering_stream.hpp>

#include <fmt/format.h>
#include <vector>

namespace osrm::server
{

Connection::Connection(boost::asio::io_context &io_context, RequestHandler &handler)
Connection::Connection(boost::asio::io_context &io_context,
RequestHandler &handler,
short keepalive_timeout)
: strand(boost::asio::make_strand(io_context)), TCP_socket(strand), timer(strand),
request_handler(handler)
request_handler(handler), keepalive_timeout(keepalive_timeout)
{
}

Expand Down Expand Up @@ -88,7 +91,9 @@ void Connection::handle_read(const boost::system::error_code &error, std::size_t
{
keep_alive = true;
current_reply.headers.emplace_back("Connection", "keep-alive");
current_reply.headers.emplace_back("Keep-Alive", "timeout=5, max=512");
current_reply.headers.emplace_back("Keep-Alive",
"timeout=" + fmt::to_string(keepalive_timeout) +
", max=" + fmt::to_string(processed_requests));
}

// compress the result w/ gzip/deflate if requested
Expand Down
22 changes: 18 additions & 4 deletions src/tools/routed.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,8 @@ inline unsigned generateServerProgramOptions(const int argc,
int &ip_port,
bool &trial,
EngineConfig &config,
int &requested_thread_num)
int &requested_thread_num,
short &keepalive_timeout)
{
using boost::filesystem::path;
using boost::program_options::value;
Expand Down Expand Up @@ -140,6 +141,9 @@ inline unsigned generateServerProgramOptions(const int argc,
("threads,t",
value<int>(&requested_thread_num)->default_value(hardware_threads),
"Number of threads to use") //
("keepalive-timeout,k",
value<short>(&keepalive_timeout)->default_value(5),
"Default keepalive-timeout. Default: 5 seconds.") //
("shared-memory,s",
value<bool>(&config.use_shared_memory)->implicit_value(true)->default_value(false),
"Load data from shared memory") //
Expand Down Expand Up @@ -266,8 +270,16 @@ try
boost::filesystem::path base_path;

int requested_thread_num = 1;
const unsigned init_result = generateServerProgramOptions(
argc, argv, base_path, ip_address, ip_port, trial_run, config, requested_thread_num);
short keepalive_timeout = 5;
const unsigned init_result = generateServerProgramOptions(argc,
argv,
base_path,
ip_address,
ip_port,
trial_run,
config,
requested_thread_num,
keepalive_timeout);
if (init_result == INIT_OK_DO_NOT_START_ENGINE)
{
return EXIT_SUCCESS;
Expand Down Expand Up @@ -307,6 +319,7 @@ try
util::Log() << "Threads: " << requested_thread_num;
util::Log() << "IP address: " << ip_address;
util::Log() << "IP port: " << ip_port;
util::Log() << "Keepalive timeout: " << keepalive_timeout;

#ifndef _WIN32
int sig = 0;
Expand All @@ -319,7 +332,8 @@ try
#endif

auto service_handler = std::make_unique<server::ServiceHandler>(config);
auto routing_server = server::Server::CreateServer(ip_address, ip_port, requested_thread_num);
auto routing_server =
server::Server::CreateServer(ip_address, ip_port, requested_thread_num, keepalive_timeout);

routing_server->RegisterServiceHandler(std::move(service_handler));

Expand Down