diff --git a/CHANGELOG.md b/CHANGELOG.md index d389493a466..c4f43265349 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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: diff --git a/features/options/routed/help.feature b/features/options/routed/help.feature index 401a5ba4f8d..fc37410788c 100644 --- a/features/options/routed/help.feature +++ b/features/options/routed/help.feature @@ -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 @@ -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 @@ -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 diff --git a/include/server/connection.hpp b/include/server/connection.hpp index 01288d17f01..3f98d4ed1d2 100644 --- a/include/server/connection.hpp +++ b/include/server/connection.hpp @@ -35,7 +35,9 @@ class RequestHandler; class Connection : public std::enable_shared_from_this { 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; diff --git a/include/server/server.hpp b/include/server/server.hpp index 99209248423..34b8982e67a 100644 --- a/include/server/server.hpp +++ b/include/server/server.hpp @@ -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 - CreateServer(std::string &ip_address, int ip_port, unsigned requested_num_threads) + static std::shared_ptr 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(ip_address, ip_port, real_num_threads); + return std::make_shared(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(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( + io_context, request_handler, keepalive_timeout)) { const auto port_string = std::to_string(port); @@ -94,7 +100,8 @@ class Server if (!e) { new_connection->start(); - new_connection = std::make_shared(io_context, request_handler); + new_connection = + std::make_shared(io_context, request_handler, keepalive_timeout); acceptor.async_accept( new_connection->socket(), boost::bind(&Server::HandleAccept, this, boost::asio::placeholders::error)); @@ -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 new_connection; diff --git a/src/server/connection.cpp b/src/server/connection.cpp index c67b40be8db..c3c07a34098 100644 --- a/src/server/connection.cpp +++ b/src/server/connection.cpp @@ -7,14 +7,17 @@ #include #include +#include #include 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) { } @@ -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 diff --git a/src/tools/routed.cpp b/src/tools/routed.cpp index bd4fd72fe42..1e6a9c2661a 100644 --- a/src/tools/routed.cpp +++ b/src/tools/routed.cpp @@ -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; @@ -140,6 +141,9 @@ inline unsigned generateServerProgramOptions(const int argc, ("threads,t", value(&requested_thread_num)->default_value(hardware_threads), "Number of threads to use") // + ("keepalive-timeout,k", + value(&keepalive_timeout)->default_value(5), + "Default keepalive-timeout. Default: 5 seconds.") // ("shared-memory,s", value(&config.use_shared_memory)->implicit_value(true)->default_value(false), "Load data from shared memory") // @@ -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; @@ -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; @@ -319,7 +332,8 @@ try #endif auto service_handler = std::make_unique(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));