Add option to only update the metric dependent data

This commit is contained in:
Patrick Niklaus 2018-04-06 00:49:23 +00:00 committed by Patrick Niklaus
parent fea07f343b
commit a915542916
4 changed files with 54 additions and 25 deletions

View File

@ -1,5 +1,5 @@
@datastore @options @help @datastore @options @help
Feature: osrm-datastore command line options: list Feature: osrm-datastore command line options
Background: Background:
Given the profile "testbot" Given the profile "testbot"
@ -17,4 +17,17 @@ Feature: osrm-datastore command line options: list
Then it should exit successfully Then it should exit successfully
When I try to run "osrm-datastore --list" When I try to run "osrm-datastore --list"
Then it should exit successfully Then it should exit successfully
And stdout should contain "test_dataset_42/data" And stdout should contain "test_dataset_42/static"
Scenario: osrm-datastore - Only metric update should work
Given the speed file
"""
0,1,50
"""
And the data has been extracted
When I try to run "osrm-datastore {processed_file} --dataset-name cucumber/only_metric_test"
Then it should exit successfully
When I try to run "osrm-customize --segment-speed-file {speeds_file} {processed_file}"
Then it should exit successfully
When I try to run "osrm-datastore {processed_file} --dataset-name cucumber/only_metric_test --only-metric"
Then it should exit successfully

View File

@ -45,7 +45,7 @@ class Storage
public: public:
Storage(StorageConfig config); Storage(StorageConfig config);
int Run(int max_wait, const std::string &name); int Run(int max_wait, const std::string &name, bool only_metric);
void PopulateStaticLayout(DataLayout &layout); void PopulateStaticLayout(DataLayout &layout);
void PopulateUpdatableLayout(DataLayout &layout); void PopulateUpdatableLayout(DataLayout &layout);

View File

@ -186,7 +186,7 @@ bool swapData(Monitor &monitor,
Storage::Storage(StorageConfig config_) : config(std::move(config_)) {} Storage::Storage(StorageConfig config_) : config(std::move(config_)) {}
int Storage::Run(int max_wait, const std::string &dataset_name) int Storage::Run(int max_wait, const std::string &dataset_name, bool only_metric)
{ {
BOOST_ASSERT_MSG(config.IsValid(), "Invalid storage config"); BOOST_ASSERT_MSG(config.IsValid(), "Invalid storage config");
@ -225,24 +225,32 @@ int Storage::Run(int max_wait, const std::string &dataset_name)
auto &shared_register = monitor.data(); auto &shared_register = monitor.data();
// Populate a memory layout into stack memory // Populate a memory layout into stack memory
DataLayout static_layout; std::vector<SharedDataIndex::AllocatedRegion> regions;
PopulateStaticLayout(static_layout); std::map<std::string, RegionHandle> handles;
if (!only_metric)
{
DataLayout static_layout;
PopulateStaticLayout(static_layout);
auto static_handle = setupRegion(shared_register, static_layout);
regions.push_back({static_handle.data_ptr, static_layout});
handles[dataset_name + "/static"] = std::move(static_handle);
}
DataLayout updatable_layout; DataLayout updatable_layout;
PopulateUpdatableLayout(updatable_layout); PopulateUpdatableLayout(updatable_layout);
auto static_handle = setupRegion(shared_register, static_layout);
auto updatable_handle = setupRegion(shared_register, updatable_layout); auto updatable_handle = setupRegion(shared_register, updatable_layout);
regions.push_back({updatable_handle.data_ptr, updatable_layout});
SharedDataIndex index{
{{static_handle.data_ptr, static_layout}, {updatable_handle.data_ptr, updatable_layout}}};
PopulateStaticData(index);
PopulateUpdatableData(index);
std::map<std::string, RegionHandle> handles;
handles[dataset_name + "/static"] = std::move(static_handle);
handles[dataset_name + "/updatable"] = std::move(updatable_handle); handles[dataset_name + "/updatable"] = std::move(updatable_handle);
SharedDataIndex index{std::move(regions)};
if (!only_metric)
{
PopulateStaticData(index);
}
PopulateUpdatableData(index);
swapData(monitor, shared_register, handles, max_wait); swapData(monitor, shared_register, handles, max_wait);
return EXIT_SUCCESS; return EXIT_SUCCESS;
@ -400,8 +408,8 @@ void Storage::PopulateStaticData(const SharedDataIndex &index)
std::string metric_name; std::string metric_name;
// load profile properties // load profile properties
{ {
const auto profile_properties_ptr = index.GetBlockPtr<extractor::ProfileProperties>( const auto profile_properties_ptr =
"/common/properties"); index.GetBlockPtr<extractor::ProfileProperties>("/common/properties");
extractor::files::readProfileProperties(config.GetPath(".osrm.properties"), extractor::files::readProfileProperties(config.GetPath(".osrm.properties"),
*profile_properties_ptr); *profile_properties_ptr);
@ -455,8 +463,8 @@ void Storage::PopulateUpdatableData(const SharedDataIndex &index)
} }
{ {
const auto datasources_names_ptr = index.GetBlockPtr<extractor::Datasources>( const auto datasources_names_ptr =
"/common/data_sources_names"); index.GetBlockPtr<extractor::Datasources>("/common/data_sources_names");
extractor::files::readDatasources(config.GetPath(".osrm.datasource_names"), extractor::files::readDatasources(config.GetPath(".osrm.datasource_names"),
*datasources_names_ptr); *datasources_names_ptr);
} }

View File

@ -75,7 +75,8 @@ bool generateDataStoreOptions(const int argc,
boost::filesystem::path &base_path, boost::filesystem::path &base_path,
int &max_wait, int &max_wait,
std::string &dataset_name, std::string &dataset_name,
bool &list_datasets) bool &list_datasets,
bool &only_metric)
{ {
// 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");
@ -105,7 +106,13 @@ bool generateDataStoreOptions(const int argc,
->default_value(false) ->default_value(false)
->implicit_value(true), ->implicit_value(true),
"Name of the dataset to load into memory. This allows having multiple datasets in memory " "Name of the dataset to load into memory. This allows having multiple datasets in memory "
"at the same time."); "at the same time.") //
("only-metric",
boost::program_options::value<bool>(&only_metric)
->default_value(false)
->implicit_value(true),
"Only reload the metric data without updating the full dataset. This is an optimization "
"for traffic updates.");
// hidden options, will be allowed on command line but will not be shown to the user // hidden options, will be allowed on command line but will not be shown to the user
boost::program_options::options_description hidden_options("Hidden options"); boost::program_options::options_description hidden_options("Hidden options");
@ -200,8 +207,9 @@ int main(const int argc, const char *argv[]) try
int max_wait = -1; int max_wait = -1;
std::string dataset_name; std::string dataset_name;
bool list_datasets = false; bool list_datasets = false;
bool only_metric = false;
if (!generateDataStoreOptions( if (!generateDataStoreOptions(
argc, argv, verbosity, base_path, max_wait, dataset_name, list_datasets)) argc, argv, verbosity, base_path, max_wait, dataset_name, list_datasets, only_metric))
{ {
return EXIT_SUCCESS; return EXIT_SUCCESS;
} }
@ -222,7 +230,7 @@ int main(const int argc, const char *argv[]) try
} }
storage::Storage storage(std::move(config)); storage::Storage storage(std::move(config));
return storage.Run(max_wait, dataset_name); return storage.Run(max_wait, dataset_name, only_metric);
} }
catch (const osrm::RuntimeError &e) catch (const osrm::RuntimeError &e)
{ {