Skip to content

Commit 813800f

Browse files
authored
Restrict number of concurrently repaired hosted packages (#4586)
1 parent 27c64ba commit 813800f

File tree

1 file changed

+32
-23
lines changed

1 file changed

+32
-23
lines changed

lib/src/source/hosted.dart

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:crypto/crypto.dart';
1313
import 'package:http/http.dart' as http;
1414
import 'package:meta/meta.dart';
1515
import 'package:path/path.dart' as p;
16+
import 'package:pool/pool.dart';
1617
import 'package:pub_semver/pub_semver.dart';
1718
import 'package:stack_trace/stack_trace.dart';
1819

@@ -1348,32 +1349,40 @@ class HostedSource extends CachedSource {
13481349

13491350
packages.sort(Package.orderByNameAndVersion);
13501351

1352+
final pool = Pool(10);
13511353
return results..addAll(
13521354
await Future.wait(
13531355
packages.map((package) async {
1354-
final id = PackageId(
1355-
package.name,
1356-
package.version,
1357-
ResolvedHostedDescription(
1358-
HostedDescription._(package.name, url),
1359-
sha256: null,
1360-
),
1361-
);
1362-
try {
1363-
deleteEntry(package.dir);
1364-
await _download(id, package.dir, cache);
1365-
return RepairResult(id.name, id.version, this, success: true);
1366-
} catch (error, stackTrace) {
1367-
var message =
1368-
'Failed to repair ${log.bold(package.name)} '
1369-
'${package.version}';
1370-
if (url != defaultUrl) message += ' from $url';
1371-
log.error('$message. Error:\n$error');
1372-
log.fine(stackTrace.toString());
1373-
1374-
tryDeleteEntry(package.dir);
1375-
return RepairResult(id.name, id.version, this, success: false);
1376-
}
1356+
return await pool.withResource(() async {
1357+
final id = PackageId(
1358+
package.name,
1359+
package.version,
1360+
ResolvedHostedDescription(
1361+
HostedDescription._(package.name, url),
1362+
sha256: null,
1363+
),
1364+
);
1365+
try {
1366+
deleteEntry(package.dir);
1367+
await _download(id, package.dir, cache);
1368+
return RepairResult(id.name, id.version, this, success: true);
1369+
} catch (error, stackTrace) {
1370+
var message =
1371+
'Failed to repair ${log.bold(package.name)} '
1372+
'${package.version}';
1373+
if (url != defaultUrl) message += ' from $url';
1374+
log.error('$message. Error:\n$error');
1375+
log.fine(stackTrace.toString());
1376+
1377+
tryDeleteEntry(package.dir);
1378+
return RepairResult(
1379+
id.name,
1380+
id.version,
1381+
this,
1382+
success: false,
1383+
);
1384+
}
1385+
});
13771386
}),
13781387
),
13791388
);

0 commit comments

Comments
 (0)