diff --git a/Include/osrm/ServerConfig.h b/Include/osrm/ServerConfig.h new file mode 100644 index 000000000..bcd561d69 --- /dev/null +++ b/Include/osrm/ServerConfig.h @@ -0,0 +1,51 @@ +/* + +Copyright (c) 2015, Project OSRM, Dennis Luxen, others +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list +of conditions and the following disclaimer. +Redistributions in binary form must reproduce the above copyright notice, this +list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +*/ + +#ifndef SERVER_CONFIG_HPP +#define SERVER_CONFIG_HPP + +#include + +struct ServerConfig +{ + ServerConfig() + : max_locations_distance_table(100) + , use_shared_memory(false) + {} + + ServerConfig(const ServerPaths &paths, const bool flag, const int max) + : server_paths(paths) + , max_locations_distance_table(max) + , use_shared_memory(flag) + {} + + ServerPaths server_paths; + int max_locations_distance_table; + bool use_shared_memory; +}; + +#endif // SERVER_CONFIG_HPP diff --git a/Library/OSRM.h b/Library/OSRM.h index 421e99658..1f35ec272 100644 --- a/Library/OSRM.h +++ b/Library/OSRM.h @@ -28,7 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #ifndef OSRM_H #define OSRM_H -#include +#include #include @@ -46,7 +46,7 @@ class OSRM std::unique_ptr OSRM_pimpl_; public: - explicit OSRM(ServerPaths paths, const bool use_shared_memory = false); + explicit OSRM(ServerConfig serverConfig); ~OSRM(); int RunQuery(RouteParameters &route_parameters, JSON::Object &json_result); }; diff --git a/Library/OSRM_impl.cpp b/Library/OSRM_impl.cpp index ea8ac8319..a557aa66a 100644 --- a/Library/OSRM_impl.cpp +++ b/Library/OSRM_impl.cpp @@ -49,16 +49,15 @@ namespace boost { namespace interprocess { class named_mutex; } } #include #include -#include #include #include #include #include -OSRM_impl::OSRM_impl(ServerPaths server_paths, const bool use_shared_memory) +OSRM_impl::OSRM_impl(ServerConfig &serverConfig) { - if (use_shared_memory) + if (serverConfig.use_shared_memory) { barrier = osrm::make_unique(); query_data_facade = new SharedDataFacade(); @@ -66,12 +65,13 @@ OSRM_impl::OSRM_impl(ServerPaths server_paths, const bool use_shared_memory) else { // populate base path - populate_base_path(server_paths); - query_data_facade = new InternalDataFacade(server_paths); + populate_base_path(serverConfig.server_paths); + query_data_facade = new InternalDataFacade(serverConfig.server_paths); } // The following plugins handle all requests. - RegisterPlugin(new DistanceTablePlugin>(query_data_facade)); + RegisterPlugin(new DistanceTablePlugin>(query_data_facade, + serverConfig.max_locations_distance_table)); RegisterPlugin(new HelloWorldPlugin()); RegisterPlugin(new LocatePlugin>(query_data_facade)); RegisterPlugin(new NearestPlugin>(query_data_facade)); @@ -151,8 +151,8 @@ int OSRM_impl::RunQuery(RouteParameters &route_parameters, JSON::Object &json_re // proxy code for compilation firewall -OSRM::OSRM(ServerPaths paths, const bool use_shared_memory) - : OSRM_pimpl_(osrm::make_unique(paths, use_shared_memory)) +OSRM::OSRM(ServerConfig server_config) + : OSRM_pimpl_(osrm::make_unique(server_config)) { } diff --git a/Library/OSRM_impl.h b/Library/OSRM_impl.h index 376e11ac3..519686277 100644 --- a/Library/OSRM_impl.h +++ b/Library/OSRM_impl.h @@ -32,11 +32,11 @@ class BasePlugin; namespace http { class Reply; } struct RouteParameters; -#include -#include - #include "../data_structures/query_edge.hpp" +#include +#include + #include #include #include @@ -50,7 +50,7 @@ class OSRM_impl using PluginMap = std::unordered_map; public: - OSRM_impl(ServerPaths paths, const bool use_shared_memory); + OSRM_impl(ServerConfig &serverConfig); OSRM_impl(const OSRM_impl &) = delete; virtual ~OSRM_impl(); int RunQuery(RouteParameters &route_parameters, JSON::Object &json_result); diff --git a/Util/ProgramOptions.h b/Util/ProgramOptions.h index 185edb0f0..b766c5519 100644 --- a/Util/ProgramOptions.h +++ b/Util/ProgramOptions.h @@ -151,7 +151,8 @@ inline unsigned GenerateServerProgramOptions(const int argc, int &ip_port, int &requested_num_threads, bool &use_shared_memory, - bool &trial) + bool &trial, + int &max_locations_distance_table) { // declare a group of options that will be allowed only on command line boost::program_options::options_description generic_options("Options"); @@ -198,7 +199,10 @@ inline unsigned GenerateServerProgramOptions(const int argc, "Number of threads to use")( "sharedmemory,s", boost::program_options::value(&use_shared_memory)->implicit_value(true), - "Load data from shared memory"); + "Load data from shared memory")( + "max_locations_distance_table", + boost::program_options::value(&max_locations_distance_table)->default_value(100), + "Max locations supported in distance table query"); // hidden options, will be allowed both on command line and in config // file, but will not be shown to the user @@ -272,6 +276,11 @@ inline unsigned GenerateServerProgramOptions(const int argc, { return INIT_OK_START_ENGINE; } + if (1 > max_locations_distance_table) + { + throw osrm::exception("Max location for distance table must be a positive number"); + } + SimpleLogger().Write() << visible_options; return INIT_OK_DO_NOT_START_ENGINE; } diff --git a/features/options/routed/help.feature b/features/options/routed/help.feature index 9603c40dd..f11787d6c 100644 --- a/features/options/routed/help.feature +++ b/features/options/routed/help.feature @@ -25,7 +25,8 @@ Feature: osrm-routed command line options: help And stdout should contain "--port" And stdout should contain "--threads" And stdout should contain "--sharedmemory" - And stdout should contain 22 lines + And stdout should contain "--max_locations_distance_table" + And stdout should contain 25 lines And it should exit with code 0 Scenario: osrm-routed - Help, short @@ -49,7 +50,8 @@ Feature: osrm-routed command line options: help And stdout should contain "--port" And stdout should contain "--threads" And stdout should contain "--sharedmemory" - And stdout should contain 22 lines + And stdout should contain "--max_locations_distance_table" + And stdout should contain 25 lines And it should exit with code 0 Scenario: osrm-routed - Help, long @@ -73,5 +75,6 @@ Feature: osrm-routed command line options: help And stdout should contain "--port" And stdout should contain "--threads" And stdout should contain "--sharedmemory" - And stdout should contain 22 lines + And stdout should contain "--max_locations_distance_table" + And stdout should contain 25 lines And it should exit with code 0 diff --git a/plugins/distance_table.hpp b/plugins/distance_table.hpp index d173651bd..e5ca5da5c 100644 --- a/plugins/distance_table.hpp +++ b/plugins/distance_table.hpp @@ -53,9 +53,11 @@ template class DistanceTablePlugin final : public BasePlugin { private: std::unique_ptr> search_engine_ptr; + int max_locations_distance_table; public: - explicit DistanceTablePlugin(DataFacadeT *facade) : descriptor_string("table"), facade(facade) + explicit DistanceTablePlugin(DataFacadeT *facade, const int max_locations_distance_table) : + max_locations_distance_table(max_locations_distance_table), descriptor_string("table"), facade(facade) { search_engine_ptr = osrm::make_unique>(facade); } @@ -72,8 +74,9 @@ template class DistanceTablePlugin final : public BasePlugin } const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum()); - unsigned max_locations = - std::min(100u, static_cast(route_parameters.coordinates.size())); + unsigned max_locations = std::min(static_cast(max_locations_distance_table), + static_cast(route_parameters.coordinates.size())); + PhantomNodeArray phantom_node_vector(max_locations); for (const auto i : osrm::irange(0u, max_locations)) { diff --git a/routed.cpp b/routed.cpp index 1be6dd805..8224c2e7b 100644 --- a/routed.cpp +++ b/routed.cpp @@ -71,7 +71,7 @@ int main(int argc, const char *argv[]) bool use_shared_memory = false, trial_run = false; std::string ip_address; - int ip_port, requested_thread_num; + int ip_port, requested_thread_num, max_locations_distance_table; ServerPaths server_paths; @@ -82,7 +82,8 @@ int main(int argc, const char *argv[]) ip_port, requested_thread_num, use_shared_memory, - trial_run); + trial_run, + max_locations_distance_table); if (init_result == INIT_OK_DO_NOT_START_ENGINE) { return 0; @@ -117,7 +118,8 @@ int main(int argc, const char *argv[]) pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask); #endif - OSRM osrm_lib(server_paths, use_shared_memory); + ServerConfig server_config(server_paths, use_shared_memory, max_locations_distance_table); + OSRM osrm_lib(server_config); auto routing_server = Server::CreateServer(ip_address, ip_port, requested_thread_num); diff --git a/tools/simpleclient.cpp b/tools/simpleclient.cpp index 801bd36eb..0a736d8b7 100644 --- a/tools/simpleclient.cpp +++ b/tools/simpleclient.cpp @@ -33,7 +33,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include #include -#include +#include #include @@ -44,16 +44,17 @@ int main(int argc, const char *argv[]) { std::string ip_address; int ip_port, requested_thread_num; - bool use_shared_memory = false, trial_run = false; - ServerPaths server_paths; + bool trial_run = false; + ServerConfig server_config; const unsigned init_result = GenerateServerProgramOptions(argc, argv, - server_paths, + server_config.server_paths, ip_address, ip_port, requested_thread_num, - use_shared_memory, - trial_run); + server_config.use_shared_memory, + trial_run, + server_config.max_locations_distance_table); if (init_result == INIT_OK_DO_NOT_START_ENGINE) { @@ -65,7 +66,7 @@ int main(int argc, const char *argv[]) } SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION; - OSRM routing_machine(server_paths, use_shared_memory); + OSRM routing_machine(server_config); RouteParameters route_parameters; route_parameters.zoom_level = 18; // no generalization