From 9600d92ca7ebecdf05577d692c1e4fe6effc2fb5 Mon Sep 17 00:00:00 2001 From: Slava Kim Date: Fri, 26 Sep 2014 17:21:48 -0700 Subject: [PATCH] Limit the number of concurrent downloads Doesn't actually help! --- packages/autoupdate/autoupdate_cordova.js | 46 +++++++++++++++-------- 1 file changed, 31 insertions(+), 15 deletions(-) diff --git a/packages/autoupdate/autoupdate_cordova.js b/packages/autoupdate/autoupdate_cordova.js index 9ae7359fc6..3af120e6b0 100644 --- a/packages/autoupdate/autoupdate_cordova.js +++ b/packages/autoupdate/autoupdate_cordova.js @@ -1,4 +1,12 @@ var DEBUG_TAG = 'METEOR CORDOVA DEBUG '; + +// This constant was picked by testing on iOS 7.1 +// We limit the number of concurrent downloads because iOS gets angry on the +// application when a certain limit is exceeded and starts timing-out the +// connections in 1-2 minutes which makes the whole HCP really slow. +var MAX_NUM_CONCURRENT_DOWNLOADS = 15; +var MAX_RETRY_COUNT = 5; + var autoupdateVersionCordova = __meteor_runtime_config__.autoupdateVersionCordova || "unknown"; // The collection of acceptable client versions. @@ -81,14 +89,19 @@ var onNewVersion = function () { manifest.push({ url: '/index.html?' + Random.id() }); - var downloads = 0; - _.each(manifest, function (item) { - if (item.url) downloads++; - }); - var versionPrefix = localPathPrefix + version; - var afterAllFilesDownloaded = _.after(downloads, function () { + var queue = []; + _.each(manifest, function (item) { + if (! item.url) return; + + var url = item.url; + url = url.replace(/\?.+$/, ''); + + queue.push(url); + }); + + var afterAllFilesDownloaded = _.after(queue.length, function () { writeFile(versionPrefix, 'manifest.json', JSON.stringify(program, undefined, 2), function (err) { @@ -118,12 +131,8 @@ var onNewVersion = function () { }); }); - _.each(manifest, function (item) { - if (! item.url) return; - - var url = item.url; - url = url.replace(/\?.+$/, ''); - + var dowloadUrl = function (url) { + console.log(DEBUG_TAG + "start dowloading " + url); // Add a cache buster to ensure that we don't cache an old asset. var uri = encodeURI(urlPrefix + url + '?' + Random.id()); @@ -132,20 +141,27 @@ var onNewVersion = function () { var tryDownload = function () { ft.download(uri, versionPrefix + url, function (entry) { if (entry) { + console.log(DEBUG_TAG + "done dowloading " + url); + // start downloading next queued url + if (queue.length) + dowloadUrl(queue.shift()); afterAllFilesDownloaded(); } }, function (err) { // It failed, try again if we have tried less than 5 times. - if (tries++ < 5) { + if (tries++ < MAX_RETRY_COUNT) { tryDownload(); } else { - console.log(DEBUG_TAG + 'fail source: ', error.source); - console.log(DEBUG_TAG + 'fail target: ', error.target); + console.log(DEBUG_TAG + "failed dowloading " + url); } }); }; tryDownload(); + }; + + _.times(Math.min(MAX_NUM_CONCURRENT_DOWNLOADS, queue.length), function () { + dowloadUrl(queue.shift()); }); }); };