diff options
author | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-08-29 14:39:57 +0300 |
---|---|---|
committer | Mikhail Pozdnyakov <mikhail.pozdnyakov@mapbox.com> | 2019-08-29 17:28:51 +0300 |
commit | f84e46ad2690e3914efe830682b41dd55dc945f3 (patch) | |
tree | 7aff04f75fe42fb36ee5b2f478ea1a3330c11d21 /platform/default/src/mbgl | |
parent | 0c80f3a383ba7a9844fa5f2379bb900d462fdd0e (diff) | |
download | qtlocation-mapboxgl-f84e46ad2690e3914efe830682b41dd55dc945f3.tar.gz |
[core] Mark offline region resources in batches
Diffstat (limited to 'platform/default/src/mbgl')
-rw-r--r-- | platform/default/src/mbgl/storage/offline_database.cpp | 20 | ||||
-rw-r--r-- | platform/default/src/mbgl/storage/offline_download.cpp | 31 |
2 files changed, 26 insertions, 25 deletions
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; } |