Merge pull request #1335 from Project-OSRM/feature/frodrigo-max_locations_distance_table

Feature/frodrigo max locations distance table
This commit is contained in:
Dennis Luxen 2015-01-08 16:07:17 +01:00
commit 0e5a448d04
9 changed files with 108 additions and 39 deletions

View File

@ -0,0 +1,52 @@
/*
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 <osrm/server_paths.hpp>
struct libosrm_config
{
libosrm_config(const libosrm_config&) = delete;
libosrm_config()
: max_locations_distance_table(100)
, use_shared_memory(false)
{}
libosrm_config(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

View File

@ -1,6 +1,6 @@
/* /*
Copyright (c) 2013, Project OSRM, Dennis Luxen, others Copyright (c) 2015, Project OSRM, Dennis Luxen, others
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, Redistribution and use in source and binary forms, with or without modification,
@ -28,7 +28,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef OSRM_H #ifndef OSRM_H
#define OSRM_H #define OSRM_H
#include <osrm/server_paths.hpp> #include <osrm/libosrm_config.hpp>
#include <memory> #include <memory>
@ -46,7 +46,7 @@ class OSRM
std::unique_ptr<OSRM_impl> OSRM_pimpl_; std::unique_ptr<OSRM_impl> OSRM_pimpl_;
public: public:
explicit OSRM(ServerPaths paths, const bool use_shared_memory = false); explicit OSRM(libosrm_config &lib_config);
~OSRM(); ~OSRM();
int RunQuery(RouteParameters &route_parameters, JSON::Object &json_result); int RunQuery(RouteParameters &route_parameters, JSON::Object &json_result);
}; };

View File

@ -1,6 +1,6 @@
/* /*
Copyright (c) 2014, Project OSRM, Dennis Luxen, others Copyright (c) 2015, Project OSRM, Dennis Luxen, others
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, Redistribution and use in source and binary forms, with or without modification,
@ -49,16 +49,15 @@ namespace boost { namespace interprocess { class named_mutex; } }
#include <boost/interprocess/sync/scoped_lock.hpp> #include <boost/interprocess/sync/scoped_lock.hpp>
#include <osrm/route_parameters.hpp> #include <osrm/route_parameters.hpp>
#include <osrm/server_paths.hpp>
#include <algorithm> #include <algorithm>
#include <fstream> #include <fstream>
#include <utility> #include <utility>
#include <vector> #include <vector>
OSRM_impl::OSRM_impl(ServerPaths server_paths, const bool use_shared_memory) OSRM_impl::OSRM_impl(libosrm_config &lib_config)
{ {
if (use_shared_memory) if (lib_config.use_shared_memory)
{ {
barrier = osrm::make_unique<SharedBarriers>(); barrier = osrm::make_unique<SharedBarriers>();
query_data_facade = new SharedDataFacade<QueryEdge::EdgeData>(); query_data_facade = new SharedDataFacade<QueryEdge::EdgeData>();
@ -66,12 +65,13 @@ OSRM_impl::OSRM_impl(ServerPaths server_paths, const bool use_shared_memory)
else else
{ {
// populate base path // populate base path
populate_base_path(server_paths); populate_base_path(lib_config.server_paths);
query_data_facade = new InternalDataFacade<QueryEdge::EdgeData>(server_paths); query_data_facade = new InternalDataFacade<QueryEdge::EdgeData>(lib_config.server_paths);
} }
// The following plugins handle all requests. // The following plugins handle all requests.
RegisterPlugin(new DistanceTablePlugin<BaseDataFacade<QueryEdge::EdgeData>>(query_data_facade)); RegisterPlugin(new DistanceTablePlugin<BaseDataFacade<QueryEdge::EdgeData>>(query_data_facade,
lib_config.max_locations_distance_table));
RegisterPlugin(new HelloWorldPlugin()); RegisterPlugin(new HelloWorldPlugin());
RegisterPlugin(new LocatePlugin<BaseDataFacade<QueryEdge::EdgeData>>(query_data_facade)); RegisterPlugin(new LocatePlugin<BaseDataFacade<QueryEdge::EdgeData>>(query_data_facade));
RegisterPlugin(new NearestPlugin<BaseDataFacade<QueryEdge::EdgeData>>(query_data_facade)); RegisterPlugin(new NearestPlugin<BaseDataFacade<QueryEdge::EdgeData>>(query_data_facade));
@ -151,8 +151,8 @@ int OSRM_impl::RunQuery(RouteParameters &route_parameters, JSON::Object &json_re
// proxy code for compilation firewall // proxy code for compilation firewall
OSRM::OSRM(ServerPaths paths, const bool use_shared_memory) OSRM::OSRM(libosrm_config &lib_config)
: OSRM_pimpl_(osrm::make_unique<OSRM_impl>(paths, use_shared_memory)) : OSRM_pimpl_(osrm::make_unique<OSRM_impl>(lib_config))
{ {
} }

View File

@ -1,6 +1,6 @@
/* /*
Copyright (c) 2013, Project OSRM, Dennis Luxen, others Copyright (c) 2015, Project OSRM, Dennis Luxen, others
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, Redistribution and use in source and binary forms, with or without modification,
@ -32,11 +32,11 @@ class BasePlugin;
namespace http { class Reply; } namespace http { class Reply; }
struct RouteParameters; struct RouteParameters;
#include <osrm/json_container.hpp>
#include <osrm/server_paths.hpp>
#include "../data_structures/query_edge.hpp" #include "../data_structures/query_edge.hpp"
#include <osrm/json_container.hpp>
#include <osrm/libosrm_config.hpp>
#include <memory> #include <memory>
#include <unordered_map> #include <unordered_map>
#include <string> #include <string>
@ -50,7 +50,7 @@ class OSRM_impl
using PluginMap = std::unordered_map<std::string, BasePlugin *>; using PluginMap = std::unordered_map<std::string, BasePlugin *>;
public: public:
OSRM_impl(ServerPaths paths, const bool use_shared_memory); OSRM_impl(libosrm_config &lib_config);
OSRM_impl(const OSRM_impl &) = delete; OSRM_impl(const OSRM_impl &) = delete;
virtual ~OSRM_impl(); virtual ~OSRM_impl();
int RunQuery(RouteParameters &route_parameters, JSON::Object &json_result); int RunQuery(RouteParameters &route_parameters, JSON::Object &json_result);

View File

@ -151,7 +151,8 @@ inline unsigned GenerateServerProgramOptions(const int argc,
int &ip_port, int &ip_port,
int &requested_num_threads, int &requested_num_threads,
bool &use_shared_memory, 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 // declare a group of options that will be allowed only on command line
boost::program_options::options_description generic_options("Options"); boost::program_options::options_description generic_options("Options");
@ -198,7 +199,10 @@ inline unsigned GenerateServerProgramOptions(const int argc,
"Number of threads to use")( "Number of threads to use")(
"sharedmemory,s", "sharedmemory,s",
boost::program_options::value<bool>(&use_shared_memory)->implicit_value(true), boost::program_options::value<bool>(&use_shared_memory)->implicit_value(true),
"Load data from shared memory"); "Load data from shared memory")(
"max_locations_distance_table",
boost::program_options::value<int>(&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 // hidden options, will be allowed both on command line and in config
// file, but will not be shown to the user // file, but will not be shown to the user
@ -272,6 +276,11 @@ inline unsigned GenerateServerProgramOptions(const int argc,
{ {
return INIT_OK_START_ENGINE; 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; SimpleLogger().Write() << visible_options;
return INIT_OK_DO_NOT_START_ENGINE; return INIT_OK_DO_NOT_START_ENGINE;
} }

View File

@ -25,7 +25,8 @@ Feature: osrm-routed command line options: help
And stdout should contain "--port" And stdout should contain "--port"
And stdout should contain "--threads" And stdout should contain "--threads"
And stdout should contain "--sharedmemory" 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 And it should exit with code 0
Scenario: osrm-routed - Help, short 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 "--port"
And stdout should contain "--threads" And stdout should contain "--threads"
And stdout should contain "--sharedmemory" 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 And it should exit with code 0
Scenario: osrm-routed - Help, long 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 "--port"
And stdout should contain "--threads" And stdout should contain "--threads"
And stdout should contain "--sharedmemory" 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 And it should exit with code 0

View File

@ -53,9 +53,11 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
{ {
private: private:
std::unique_ptr<SearchEngine<DataFacadeT>> search_engine_ptr; std::unique_ptr<SearchEngine<DataFacadeT>> search_engine_ptr;
int max_locations_distance_table;
public: 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<SearchEngine<DataFacadeT>>(facade); search_engine_ptr = osrm::make_unique<SearchEngine<DataFacadeT>>(facade);
} }
@ -72,8 +74,9 @@ template <class DataFacadeT> class DistanceTablePlugin final : public BasePlugin
} }
const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum()); const bool checksum_OK = (route_parameters.check_sum == facade->GetCheckSum());
unsigned max_locations = unsigned max_locations = std::min(static_cast<unsigned>(max_locations_distance_table),
std::min(100u, static_cast<unsigned>(route_parameters.coordinates.size())); static_cast<unsigned>(route_parameters.coordinates.size()));
PhantomNodeArray phantom_node_vector(max_locations); PhantomNodeArray phantom_node_vector(max_locations);
for (const auto i : osrm::irange(0u, max_locations)) for (const auto i : osrm::irange(0u, max_locations))
{ {

View File

@ -69,20 +69,21 @@ int main(int argc, const char *argv[])
{ {
LogPolicy::GetInstance().Unmute(); LogPolicy::GetInstance().Unmute();
bool use_shared_memory = false, trial_run = false; bool trial_run = false;
std::string ip_address; std::string ip_address;
int ip_port, requested_thread_num; int ip_port, requested_thread_num;
ServerPaths server_paths; libosrm_config lib_config;
const unsigned init_result = GenerateServerProgramOptions(argc, const unsigned init_result = GenerateServerProgramOptions(argc,
argv, argv,
server_paths, lib_config.server_paths,
ip_address, ip_address,
ip_port, ip_port,
requested_thread_num, requested_thread_num,
use_shared_memory, lib_config.use_shared_memory,
trial_run); trial_run,
lib_config.max_locations_distance_table);
if (init_result == INIT_OK_DO_NOT_START_ENGINE) if (init_result == INIT_OK_DO_NOT_START_ENGINE)
{ {
return 0; return 0;
@ -101,7 +102,7 @@ int main(int argc, const char *argv[])
#endif #endif
SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION; SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION;
if (use_shared_memory) if (lib_config.use_shared_memory)
{ {
SimpleLogger().Write(logDEBUG) << "Loading from shared memory"; SimpleLogger().Write(logDEBUG) << "Loading from shared memory";
} }
@ -117,7 +118,7 @@ int main(int argc, const char *argv[])
pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask); pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask);
#endif #endif
OSRM osrm_lib(server_paths, use_shared_memory); OSRM osrm_lib(lib_config);
auto routing_server = auto routing_server =
Server::CreateServer(ip_address, ip_port, requested_thread_num); Server::CreateServer(ip_address, ip_port, requested_thread_num);

View File

@ -32,8 +32,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "../Util/simple_logger.hpp" #include "../Util/simple_logger.hpp"
#include <osrm/json_container.hpp> #include <osrm/json_container.hpp>
#include <osrm/libosrm_config.hpp>
#include <osrm/route_parameters.hpp> #include <osrm/route_parameters.hpp>
#include <osrm/server_paths.hpp>
#include <string> #include <string>
@ -44,16 +44,17 @@ int main(int argc, const char *argv[])
{ {
std::string ip_address; std::string ip_address;
int ip_port, requested_thread_num; int ip_port, requested_thread_num;
bool use_shared_memory = false, trial_run = false; bool trial_run = false;
ServerPaths server_paths; libosrm_config lib_config;
const unsigned init_result = GenerateServerProgramOptions(argc, const unsigned init_result = GenerateServerProgramOptions(argc,
argv, argv,
server_paths, lib_config.server_paths,
ip_address, ip_address,
ip_port, ip_port,
requested_thread_num, requested_thread_num,
use_shared_memory, lib_config.use_shared_memory,
trial_run); trial_run,
lib_config.max_locations_distance_table);
if (init_result == INIT_OK_DO_NOT_START_ENGINE) 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; SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION;
OSRM routing_machine(server_paths, use_shared_memory); OSRM routing_machine(lib_config);
RouteParameters route_parameters; RouteParameters route_parameters;
route_parameters.zoom_level = 18; // no generalization route_parameters.zoom_level = 18; // no generalization