From b9795a480214232b99ec2b4ac81bb3129a5b2042 Mon Sep 17 00:00:00 2001 From: Stanislaw Adaszewski Date: Fri, 7 Feb 2020 18:18:06 +0100 Subject: [PATCH] Downloading all blocks in parallel for better performance. --- .../src/js/component/wb-collection-content.js | 2 +- frontend/src/js/misc/wb-download-file.js | 41 +++++++++++-------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/frontend/src/js/component/wb-collection-content.js b/frontend/src/js/component/wb-collection-content.js index cc14d5c..b71cbb1 100644 --- a/frontend/src/js/component/wb-collection-content.js +++ b/frontend/src/js/component/wb-collection-content.js @@ -67,7 +67,7 @@ class WBCollectionContent extends Component { null, (
) ] : [ - ({ item[1] }), + item[1], 'File', filesize(item[2]), (
diff --git a/frontend/src/js/misc/wb-download-file.js b/frontend/src/js/misc/wb-download-file.js index d479f81..6010736 100644 --- a/frontend/src/js/misc/wb-download-file.js +++ b/frontend/src/js/misc/wb-download-file.js @@ -6,7 +6,6 @@ function wbDownloadFile(arvHost, arvToken, const file = manifestReader.getFile(path); const name = path.split('/').reverse()[0]; const blockRefs = file[0]; - let proxy; let prom = makeArvadosRequest(arvHost, arvToken, '/arvados/v1/keep_services'); @@ -14,26 +13,34 @@ function wbDownloadFile(arvHost, arvToken, const services = xhr.response['items']; const proxies = services.filter(svc => (svc.service_type === 'proxy')); const n = Math.floor(Math.random() * proxies.length); - proxy = proxies[n]; - }); + const proxy = proxies[n]; + const blocks = []; + + let prom_2 = new Promise(accept => accept()); + + for (let i = 0; i < blockRefs.length; i++) { + const [ locator, position, size ] = blockRefs[i]; + + const prom_1 = makeArvadosRequest( + proxy.service_host + ':' + proxy.service_port, + arvToken, + '/' + locator, + { 'useSsl': proxy.service_ssl_flag, + 'responseType': 'arraybuffer' } + ); - const blocks = []; - for (let i = 0; i < blockRefs.length; i++) { - const [ locator, position, size ] = blockRefs[i]; + prom_2 = prom_2.then(() => prom_1); - prom = prom.then(() => makeArvadosRequest( - proxy.service_host + ':' + proxy.service_port, - arvToken, - '/' + locator, - { 'useSsl': proxy.service_ssl_flag, - 'responseType': 'arraybuffer' } - )); + prom_2 = prom_2.then(xhr => (blocks.push(xhr.response.slice(position, + position + size)))); + } + + prom_2 = prom_2.then(() => blocks); + + return prom_2; + }); - prom = prom.then(xhr => (blocks.push(xhr.response.slice(position, - position + size)))); - } - prom = prom.then(() => blocks); /* prom = prom.then(() => { const blob = new Blob(blocks);