diff options
Diffstat (limited to 'platform')
4 files changed, 30 insertions, 27 deletions
diff --git a/platform/default/include/mbgl/storage/offline_database.hpp b/platform/default/include/mbgl/storage/offline_database.hpp index fe286575a4..e19dcfade9 100644 --- a/platform/default/include/mbgl/storage/offline_database.hpp +++ b/platform/default/include/mbgl/storage/offline_database.hpp @@ -78,8 +78,8 @@ public: std::exception_ptr invalidateRegion(int64_t regionID); // Return value is (response, stored size) - optional<std::pair<Response, uint64_t>> getRegionResource(int64_t regionID, const Resource&); - optional<int64_t> hasRegionResource(int64_t regionID, const Resource&); + optional<std::pair<Response, uint64_t>> getRegionResource(const Resource&); + optional<int64_t> hasRegionResource(const Resource&); uint64_t putRegionResource(int64_t regionID, const Resource&, const Response&); void putRegionResources(int64_t regionID, const std::list<std::tuple<Resource, Response>>&, OfflineRegionStatus&); diff --git a/platform/default/include/mbgl/storage/offline_download.hpp b/platform/default/include/mbgl/storage/offline_download.hpp index fe5d26f9eb..53b42ae9d1 100644 --- a/platform/default/include/mbgl/storage/offline_download.hpp +++ b/platform/default/include/mbgl/storage/offline_download.hpp @@ -60,10 +60,12 @@ private: std::list<std::unique_ptr<AsyncRequest>> requests; std::unordered_set<std::string> requiredSourceURLs; std::deque<Resource> resourcesRemaining; + std::list<Resource> resourcesToBeMarkedAsUsed; std::list<std::tuple<Resource, Response>> buffer; void queueResource(Resource&&); void queueTiles(style::SourceType, uint16_t tileSize, const Tileset&); + void markPendingUsedResources(); }; } // namespace mbgl diff --git a/platform/default/src/mbgl/storage/offline_database.cpp b/platform/default/src/mbgl/storage/offline_database.cpp index 31442c1bde..83eea7bcc4 100644 --- a/platform/default/src/mbgl/storage/offline_database.cpp +++ b/platform/default/src/mbgl/storage/offline_database.cpp @@ -877,27 +877,15 @@ std::exception_ptr OfflineDatabase::deleteRegion(OfflineRegion&& region) try { return std::current_exception(); } -optional<std::pair<Response, uint64_t>> OfflineDatabase::getRegionResource(int64_t regionID, const Resource& resource) try { - auto response = getInternal(resource); - - if (response) { - markUsed(regionID, resource); - } - - return response; +optional<std::pair<Response, uint64_t>> OfflineDatabase::getRegionResource(const Resource& resource) try { + return getInternal(resource); } catch (const mapbox::sqlite::Exception& ex) { handleError(ex, "read region resource"); return nullopt; } -optional<int64_t> OfflineDatabase::hasRegionResource(int64_t regionID, const Resource& resource) try { - auto response = hasInternal(resource); - - if (response) { - markUsed(regionID, resource); - } - - return response; +optional<int64_t> OfflineDatabase::hasRegionResource(const Resource& resource) try { + return hasInternal(resource); } catch (const mapbox::sqlite::Exception& ex) { handleError(ex, "query region resource"); return nullopt; diff --git a/platform/default/src/mbgl/storage/offline_download.cpp b/platform/default/src/mbgl/storage/offline_download.cpp index e27e645a13..d28c849541 100644 --- a/platform/default/src/mbgl/storage/offline_download.cpp +++ b/platform/default/src/mbgl/storage/offline_download.cpp @@ -353,10 +353,13 @@ void OfflineDownload::activateDownload() { */ void OfflineDownload::continueDownload() { if (resourcesRemaining.empty() && status.complete()) { + markPendingUsedResources(); setState(OfflineRegionDownloadState::Inactive); return; } + if (resourcesToBeMarkedAsUsed.size() >= 200) markPendingUsedResources(); + while (!resourcesRemaining.empty() && requests.size() < onlineFileSource.getMaximumConcurrentRequests()) { ensureResource(std::move(resourcesRemaining.front())); resourcesRemaining.pop_front(); @@ -391,6 +394,11 @@ void OfflineDownload::queueTiles(SourceType type, uint16_t tileSize, const Tiles }); } +void OfflineDownload::markPendingUsedResources() { + offlineDatabase.markUsedResources(id, resourcesToBeMarkedAsUsed); + resourcesToBeMarkedAsUsed.clear(); +} + void OfflineDownload::ensureResource(Resource&& resource, std::function<void(Response)> callback) { assert(resource.priority == Resource::Priority::Low); @@ -399,24 +407,29 @@ void OfflineDownload::ensureResource(Resource&& resource, auto workRequestsIt = requests.insert(requests.begin(), nullptr); *workRequestsIt = util::RunLoop::Get()->invokeCancellable([=]() { requests.erase(workRequestsIt); - + const auto resourceKind = resource.kind; auto getResourceSizeInDatabase = [&] () -> optional<int64_t> { + optional<int64_t> result; if (!callback) { - return offlineDatabase.hasRegionResource(id, resource); - } - optional<std::pair<Response, uint64_t>> response = offlineDatabase.getRegionResource(id, resource); - if (!response) { - return {}; + result = offlineDatabase.hasRegionResource(resource); + } else { + optional<std::pair<Response, uint64_t>> response = offlineDatabase.getRegionResource(resource); + if (response) { + callback(response->first); + result = response->second; + } } - callback(response->first); - return response->second; + + if (result) resourcesToBeMarkedAsUsed.emplace_back(std::move(resource)); + return result; }; optional<int64_t> offlineResponse = getResourceSizeInDatabase(); if (offlineResponse) { + assert(!resourcesToBeMarkedAsUsed.empty()); status.completedResourceCount++; status.completedResourceSize += *offlineResponse; - if (resource.kind == Resource::Kind::Tile) { + if (resourceKind == Resource::Kind::Tile) { status.completedTileCount += 1; status.completedTileSize += *offlineResponse; } |