From f7385f4a59afa55b3658110aeb77cc87a7fa5ef8 Mon Sep 17 00:00:00 2001 From: Liam Appelbe Date: Thu, 1 May 2025 11:10:56 +1000 Subject: [PATCH 1/2] [coverage] Fix another flaky lifecycle management error --- pkgs/coverage/lib/src/isolate_paused_listener.dart | 9 +++++++-- pkgs/coverage/test/isolate_paused_listener_test.dart | 6 +++--- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/pkgs/coverage/lib/src/isolate_paused_listener.dart b/pkgs/coverage/lib/src/isolate_paused_listener.dart index 915acf50e..49f17e7a9 100644 --- a/pkgs/coverage/lib/src/isolate_paused_listener.dart +++ b/pkgs/coverage/lib/src/isolate_paused_listener.dart @@ -27,6 +27,7 @@ class IsolatePausedListener { final SyncErrorLogger _log; final _isolateGroups = {}; + final _oldCollectionTasks = >{}; int _numIsolates = 0; bool _finishedListening = false; @@ -48,7 +49,7 @@ class IsolatePausedListener { _finishedListening = true; // Collect all remaining uncollected groups. - final collectionTasks = >[]; + final collectionTasks = _oldCollectionTasks.toList(); for (final group in _isolateGroups.values) { if (!group.collected) { group.collected = true; @@ -91,9 +92,13 @@ class IsolatePausedListener { if (isLastIsolateInGroup) { group.collected = true; } + Future? collectionTask; try { - await _onIsolatePaused(isolateRef, isLastIsolateInGroup); + collectionTask = _onIsolatePaused(isolateRef, isLastIsolateInGroup); + _oldCollectionTasks.add(collectionTask); + await collectionTask; } finally { + _oldCollectionTasks.remove(collectionTask); group.exit(isolateRef); if (!_finishedListening) { await _service.resume(isolateRef.id!); diff --git a/pkgs/coverage/test/isolate_paused_listener_test.dart b/pkgs/coverage/test/isolate_paused_listener_test.dart index 53134db08..55d204528 100644 --- a/pkgs/coverage/test/isolate_paused_listener_test.dart +++ b/pkgs/coverage/test/isolate_paused_listener_test.dart @@ -867,7 +867,7 @@ void main() { pauseEvent('B', '2'); pauseEvent('A', '1', 'main'); - while (received.length < 4) { + while (received.length < 3) { await Future.delayed(Duration.zero); } @@ -875,7 +875,6 @@ void main() { 'Pause B. Collect group 2? Yes', 'Pause A. Collect group 1? Yes', 'Pause done A', - 'Resume A', ]); delayingB.complete(); @@ -884,8 +883,9 @@ void main() { 'Pause B. Collect group 2? Yes', 'Pause A. Collect group 1? Yes', 'Pause done A', - 'Resume A', 'Pause done B', + // A waits for B's pause callback to complete before resuming. + 'Resume A', // Don't try to resume B, because the VM service is already shut down. ]); }); From 2a4c2c95ca1f26a2786f211927445fe9307e1b5d Mon Sep 17 00:00:00 2001 From: Liam Appelbe Date: Thu, 1 May 2025 11:15:34 +1000 Subject: [PATCH 2/2] changelog --- pkgs/coverage/CHANGELOG.md | 5 +++++ pkgs/coverage/pubspec.yaml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/pkgs/coverage/CHANGELOG.md b/pkgs/coverage/CHANGELOG.md index 3c843f3f8..6dc80a537 100644 --- a/pkgs/coverage/CHANGELOG.md +++ b/pkgs/coverage/CHANGELOG.md @@ -1,3 +1,8 @@ +## 1.13.1 + +- Fix a bug where the VM service can be shut down while some coverage + collections are still happening. + ## 1.13.0 - Introduced support for minimum coverage thresholds using --fail-under flag in diff --git a/pkgs/coverage/pubspec.yaml b/pkgs/coverage/pubspec.yaml index 621832101..46307b824 100644 --- a/pkgs/coverage/pubspec.yaml +++ b/pkgs/coverage/pubspec.yaml @@ -1,5 +1,5 @@ name: coverage -version: 1.13.0 +version: 1.13.1 description: Coverage data manipulation and formatting repository: https://github.com/dart-lang/tools/tree/main/pkgs/coverage issue_tracker: https://github.com/dart-lang/tools/issues?q=is%3Aissue+is%3Aopen+label%3Apackage%3Acoverage