diff --git a/include/engine/engine.hpp b/include/engine/engine.hpp index 79df2f922..dc4e9ae55 100644 --- a/include/engine/engine.hpp +++ b/include/engine/engine.hpp @@ -19,6 +19,9 @@ #include "engine/plugins/viaroute.hpp" #include "engine/routing_algorithms.hpp" #include "engine/status.hpp" + +#include "storage/serialization.hpp" + #include "util/exception.hpp" #include "util/exception_utils.hpp" #include "util/fingerprint.hpp" @@ -151,9 +154,11 @@ bool Engine::CheckCompatibility(const EngineC boost::interprocess::scoped_lock current_region_lock(barrier.get_mutex()); auto mem = storage::makeSharedMemory(barrier.data().region); - auto layout = reinterpret_cast(mem->Ptr()); - return layout->GetBlockSize("/ch/contracted_graph/node_array") > 4 && - layout->GetBlockSize("/ch/contracted_graph/edge_array") > 4; + storage::DataLayout layout; + storage::io::BufferReader reader(reinterpret_cast(mem->Ptr()), mem->Size()); + storage::serialization::read(reader, layout); + return layout.HasBlock("/ch/contracted_graph/node_array") && + layout.HasBlock("/ch/contracted_graph/edge_array"); } else { @@ -171,21 +176,24 @@ bool Engine::CheckCompatibility(const Engine boost::interprocess::scoped_lock current_region_lock(barrier.get_mutex()); auto mem = storage::makeSharedMemory(barrier.data().region); - auto layout = reinterpret_cast(mem->Ptr()); + storage::DataLayout layout; + storage::io::BufferReader reader(reinterpret_cast(mem->Ptr()), mem->Size()); + storage::serialization::read(reader, layout); + // checks that all the needed memory blocks are populated // "/mld/cellstorage/source_boundary" and "/mld/cellstorage/destination_boundary" // are not checked, because in situations where there are so few nodes in the graph that // they all fit into one cell, they can be empty. - bool empty_data = layout->GetBlockSize("/mld/multilevelpartition/level_data") > 0 && - layout->GetBlockSize("/mld/multilevelpartition/partition") > 0 && - layout->GetBlockSize("/mld/multilevelpartition/cell_to_children") > 0 && - layout->GetBlockSize("/mld/cellstorage/cells") > 0 && - layout->GetBlockSize("/mld/cellstorage/level_to_cell_offset") > 0 && - layout->GetBlockSize("/mld/multilevelgraph/node_array") > 0 && - layout->GetBlockSize("/mld/multilevelgraph/edge_array") > 0 && - layout->GetBlockSize("/mld/metrics/0/weights") > 0 && - layout->GetBlockSize("/mld/metrics/0/durations") > 0 && - layout->GetBlockSize("/mld/multilevelgraph/node_to_edge_offset") > 0; + bool empty_data = layout.HasBlock("/mld/multilevelpartition/level_data") && + layout.HasBlock("/mld/multilevelpartition/partition") && + layout.HasBlock("/mld/multilevelpartition/cell_to_children") && + layout.HasBlock("/mld/cellstorage/cells") && + layout.HasBlock("/mld/cellstorage/level_to_cell_offset") && + layout.HasBlock("/mld/multilevelgraph/node_array") && + layout.HasBlock("/mld/multilevelgraph/edge_array") && + layout.HasBlock("/mld/metrics/0/weights") && + layout.HasBlock("/mld/metrics/0/durations") && + layout.HasBlock("/mld/multilevelgraph/node_to_edge_offset"); return empty_data; } else diff --git a/include/storage/shared_datatype.hpp b/include/storage/shared_datatype.hpp index 5d2b4893f..b42b6be91 100644 --- a/include/storage/shared_datatype.hpp +++ b/include/storage/shared_datatype.hpp @@ -71,6 +71,8 @@ class DataLayout inline uint64_t GetBlockSize(const std::string &name) const { return GetBlock(name).byte_size; } + inline bool HasBlock(const std::string &name) const { return blocks.find(name) != blocks.end(); } + inline uint64_t GetSizeOfLayout() const { uint64_t result = 0; diff --git a/include/storage/shared_memory.hpp b/include/storage/shared_memory.hpp index a3ced80d2..86dc3fe55 100644 --- a/include/storage/shared_memory.hpp +++ b/include/storage/shared_memory.hpp @@ -47,6 +47,7 @@ class SharedMemory { public: void *Ptr() const { return region.get_address(); } + std::size_t Size() const { return region.get_size(); } SharedMemory(const SharedMemory &) = delete; SharedMemory &operator=(const SharedMemory &) = delete; @@ -200,6 +201,7 @@ class SharedMemory public: void *Ptr() const { return region.get_address(); } + std::size_t Size() const { return region.get_size(); } SharedMemory(const boost::filesystem::path &lock_file, const int id, const uint64_t size = 0) { diff --git a/src/engine/datafacade/shared_memory_allocator.cpp b/src/engine/datafacade/shared_memory_allocator.cpp index 91331acc0..e3ef0f0c1 100644 --- a/src/engine/datafacade/shared_memory_allocator.cpp +++ b/src/engine/datafacade/shared_memory_allocator.cpp @@ -20,7 +20,7 @@ SharedMemoryAllocator::SharedMemoryAllocator(storage::SharedDataType data_region BOOST_ASSERT(storage::SharedMemory::RegionExists(data_region)); m_large_memory = storage::makeSharedMemory(data_region); - storage::io::BufferReader reader(GetMemory()); + storage::io::BufferReader reader(reinterpret_cast(m_large_memory->Ptr()), m_large_memory->Size()); storage::serialization::read(reader, data_layout); layout_size = reader.GetPosition(); util::Log(logDEBUG) << "Data layout has size " << layout_size; diff --git a/src/osrm/osrm.cpp b/src/osrm/osrm.cpp index c672c77d5..9a190a7a7 100644 --- a/src/osrm/osrm.cpp +++ b/src/osrm/osrm.cpp @@ -32,12 +32,6 @@ OSRM::OSRM(engine::EngineConfig &config) storage::SharedMonitor barrier; using mutex_type = typename decltype(barrier)::mutex_type; boost::interprocess::scoped_lock current_region_lock(barrier.get_mutex()); - - auto mem = storage::makeSharedMemory(barrier.data().region); - auto layout = reinterpret_cast(mem->Ptr()); - if (layout->GetBlockSize("/common/names/values") == 0) - throw util::exception( - "No name data loaded, cannot continue. Have you run osrm-datastore to load data?"); } // Now, check that the algorithm requested can be used with the data diff --git a/src/storage/storage.cpp b/src/storage/storage.cpp index 2295b8dd5..622e5c428 100644 --- a/src/storage/storage.cpp +++ b/src/storage/storage.cpp @@ -165,6 +165,7 @@ int Storage::Run(int max_wait) // Allocate shared memory block auto regions_size = encoded_layout.size() + layout.GetSizeOfLayout(); + util::Log() << "Data layout has a size of " << encoded_layout.size() << " bytes"; util::Log() << "Allocating shared memory of " << regions_size << " bytes"; auto data_memory = makeSharedMemory(next_region, regions_size);