diff --git a/ugc/api.cpp b/ugc/api.cpp index b709b344f8..b23d18d0c5 100644 --- a/ugc/api.cpp +++ b/ugc/api.cpp @@ -9,7 +9,10 @@ using namespace ugc; namespace ugc { -Api::Api(Index const & index) : m_storage(index), m_loader(index) {} +Api::Api(Index const & index) : m_storage(index), m_loader(index) +{ + m_thread.Push([this] { m_storage.Load(); }); +} void Api::GetUGC(FeatureID const & id, UGCCallback callback) { diff --git a/ugc/storage.cpp b/ugc/storage.cpp index 6c15a371a0..171af6095c 100644 --- a/ugc/storage.cpp +++ b/ugc/storage.cpp @@ -72,11 +72,8 @@ string SerializeUGCIndex(vector const & indexes) } } // namespace -Storage::Storage(Index const & index) : m_index(index) { Load(); } - UGCUpdate Storage::GetUGCUpdate(FeatureID const & id) const { - ASSERT_THREAD_CHECKER(m_threadChecker, ()); if (m_UGCIndexes.empty()) return {}; @@ -120,7 +117,6 @@ UGCUpdate Storage::GetUGCUpdate(FeatureID const & id) const void Storage::SetUGCUpdate(FeatureID const & id, UGCUpdate const & ugc) { - ASSERT_THREAD_CHECKER(m_threadChecker, ()); auto const feature = GetFeature(id); CHECK_EQUAL(feature->GetFeatureType(), feature::EGeomType::GEOM_POINT, ()); auto const & mercator = feature->GetCenter(); @@ -166,7 +162,6 @@ void Storage::SetUGCUpdate(FeatureID const & id, UGCUpdate const & ugc) void Storage::Load() { - ASSERT_THREAD_CHECKER(m_threadChecker, ()); string data; auto const indexFilePath = GetIndexFilePath(); try @@ -190,7 +185,6 @@ void Storage::Load() void Storage::SaveIndex() const { - ASSERT_THREAD_CHECKER(m_threadChecker, ()); if (m_UGCIndexes.empty()) return; @@ -209,7 +203,6 @@ void Storage::SaveIndex() const void Storage::Defragmentation() { - ASSERT_THREAD_CHECKER(m_threadChecker, ()); auto const indexesSize = m_UGCIndexes.size(); if (m_numberOfDeleted < indexesSize / 2) return; @@ -260,7 +253,6 @@ void Storage::Defragmentation() string Storage::GetUGCToSend() const { - ASSERT_THREAD_CHECKER(m_threadChecker, ()); if (m_UGCIndexes.empty()) return string(); @@ -323,12 +315,21 @@ string Storage::GetUGCToSend() const void Storage::MarkAllAsSynchronized() { - ASSERT_THREAD_CHECKER(m_threadChecker, ()); if (m_UGCIndexes.empty()) return; + size_t numberOfUnsynchronized = 0; for (auto & index : m_UGCIndexes) - index.m_synchronized = true; + { + if (!index.m_synchronized) + { + index.m_synchronized = true; + numberOfUnsynchronized++; + } + } + + if (numberOfUnsynchronized == 0) + return; auto const indexPath = GetIndexFilePath(); my::DeleteFileX(indexPath); @@ -337,7 +338,6 @@ void Storage::MarkAllAsSynchronized() uint64_t Storage::UGCSizeAtIndex(size_t const indexPosition) const { - ASSERT_THREAD_CHECKER(m_threadChecker, ()); CHECK(!m_UGCIndexes.empty(), ()); auto const indexesSize = m_UGCIndexes.size(); CHECK_LESS(indexPosition, indexesSize, ()); @@ -354,7 +354,6 @@ uint64_t Storage::UGCSizeAtIndex(size_t const indexPosition) const unique_ptr Storage::GetFeature(FeatureID const & id) const { - ASSERT_THREAD_CHECKER(m_threadChecker, ()); CHECK(id.IsValid(), ()); Index::FeaturesLoaderGuard guard(m_index, id.m_mwmId); auto feature = guard.GetOriginalOrEditedFeatureByIndex(id.m_index); diff --git a/ugc/storage.hpp b/ugc/storage.hpp index c8f9cb6a67..355881ef4e 100644 --- a/ugc/storage.hpp +++ b/ugc/storage.hpp @@ -37,7 +37,7 @@ public: uint32_t m_featureId = 0; }; - explicit Storage(Index const & index); + explicit Storage(Index const & index) : m_index(index) {} UGCUpdate GetUGCUpdate(FeatureID const & id) const; void SetUGCUpdate(FeatureID const & id, UGCUpdate const & ugc); @@ -45,19 +45,18 @@ public: std::string GetUGCToSend() const; void MarkAllAsSynchronized(); void Defragmentation(); + void Load(); /// Testing std::vector const & GetIndexesForTesting() const { return m_UGCIndexes; } size_t GetNumberOfDeletedForTesting() const { return m_numberOfDeleted; } private: - void Load(); uint64_t UGCSizeAtIndex(size_t const indexPosition) const; std::unique_ptr GetFeature(FeatureID const & id) const; Index const & m_index; std::vector m_UGCIndexes; size_t m_numberOfDeleted = 0; - ThreadChecker m_threadChecker; }; } // namespace ugc diff --git a/ugc/ugc_tests/storage_tests.cpp b/ugc/ugc_tests/storage_tests.cpp index fada557995..84219e734f 100644 --- a/ugc/ugc_tests/storage_tests.cpp +++ b/ugc/ugc_tests/storage_tests.cpp @@ -167,6 +167,7 @@ UNIT_TEST(StorageTests_Smoke) auto const id = builder.FeatureIdForCafeAtPoint(point); auto const original = MakeTestUGCUpdate(Time(chrono::hours(24 * 300))); Storage storage(builder.GetIndex()); + storage.Load(); storage.SetUGCUpdate(id, original); auto const actual = storage.GetUGCUpdate(id); TEST_EQUAL(original, actual, ()); @@ -189,6 +190,7 @@ UNIT_TEST(StorageTests_DuplicatesAndDefragmentationSmoke) auto const third = MakeTestUGCUpdate(Time(chrono::hours(24 * 300))); auto const last = MakeTestUGCUpdate(Time(chrono::hours(24 * 100))); Storage storage(builder.GetIndex()); + storage.Load(); storage.SetUGCUpdate(cafeId, first); storage.SetUGCUpdate(cafeId, second); storage.SetUGCUpdate(cafeId, third); @@ -215,6 +217,7 @@ UNIT_TEST(StorageTests_DifferentTypes) auto const cafeUGC = MakeTestUGCUpdate(Time(chrono::hours(24 * 10))); auto const railwayUGC = MakeTestUGCUpdate(Time(chrono::hours(24 * 300))); Storage storage(builder.GetIndex()); + storage.Load(); storage.SetUGCUpdate(cafeId, cafeUGC); storage.SetUGCUpdate(railwayId, railwayUGC); TEST_EQUAL(railwayUGC, storage.GetUGCUpdate(railwayId), ()); @@ -235,12 +238,14 @@ UNIT_TEST(StorageTest_LoadIndex) { Storage storage(builder.GetIndex()); + storage.Load(); storage.SetUGCUpdate(cafeId, cafeUGC); storage.SetUGCUpdate(railwayId, railwayUGC); storage.SaveIndex(); } Storage storage(builder.GetIndex()); + storage.Load(); auto const & indexArray = storage.GetIndexesForTesting(); TEST_EQUAL(indexArray.size(), 2, ()); for (auto const & i : indexArray)