From a9181e7495afbe728aa99c0064215cdb3148bac5 Mon Sep 17 00:00:00 2001 From: Sigurd Meldgaard Date: Fri, 23 May 2025 09:56:11 +0000 Subject: [PATCH] Restrict number of concurrently repaired hosted packages --- lib/src/source/hosted.dart | 55 ++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 23 deletions(-) diff --git a/lib/src/source/hosted.dart b/lib/src/source/hosted.dart index f28ce015f..269c7a0db 100644 --- a/lib/src/source/hosted.dart +++ b/lib/src/source/hosted.dart @@ -13,6 +13,7 @@ import 'package:crypto/crypto.dart'; import 'package:http/http.dart' as http; import 'package:meta/meta.dart'; import 'package:path/path.dart' as p; +import 'package:pool/pool.dart'; import 'package:pub_semver/pub_semver.dart'; import 'package:stack_trace/stack_trace.dart'; @@ -1348,32 +1349,40 @@ class HostedSource extends CachedSource { packages.sort(Package.orderByNameAndVersion); + final pool = Pool(10); return results..addAll( await Future.wait( packages.map((package) async { - final id = PackageId( - package.name, - package.version, - ResolvedHostedDescription( - HostedDescription._(package.name, url), - sha256: null, - ), - ); - try { - deleteEntry(package.dir); - await _download(id, package.dir, cache); - return RepairResult(id.name, id.version, this, success: true); - } catch (error, stackTrace) { - var message = - 'Failed to repair ${log.bold(package.name)} ' - '${package.version}'; - if (url != defaultUrl) message += ' from $url'; - log.error('$message. Error:\n$error'); - log.fine(stackTrace.toString()); - - tryDeleteEntry(package.dir); - return RepairResult(id.name, id.version, this, success: false); - } + return await pool.withResource(() async { + final id = PackageId( + package.name, + package.version, + ResolvedHostedDescription( + HostedDescription._(package.name, url), + sha256: null, + ), + ); + try { + deleteEntry(package.dir); + await _download(id, package.dir, cache); + return RepairResult(id.name, id.version, this, success: true); + } catch (error, stackTrace) { + var message = + 'Failed to repair ${log.bold(package.name)} ' + '${package.version}'; + if (url != defaultUrl) message += ' from $url'; + log.error('$message. Error:\n$error'); + log.fine(stackTrace.toString()); + + tryDeleteEntry(package.dir); + return RepairResult( + id.name, + id.version, + this, + success: false, + ); + } + }); }), ), );