Skip to content

[coverage] Finish collection as soon as main isolate exits #2069

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Apr 9, 2025

Conversation

liamappelbe
Copy link
Contributor

In ordinary Dart programs, the VM exits as soon as the main isolate exits. This effectively kills any remaining isolates without waiting for them to shut down.

The package:coverage's usual mode is to wait for isolates to pause before exiting, then collect their coverage, then resume them and allow them to exit. The existing coverage collection flow waited for all isolates to pause/exit before allowing the main isolate to exit, ensuring that complete coverage data was gathered for all isolates.

However, some packages have a pattern where they start a helper isolate, leave it running in the background, and never shut it down. Gathering coverage on a package like that leads to a bug where coverage collection never completes.

To fix this, I changed the flow so that as soon as the main isolate enters the paused-at-exit state, coverage is collected for all remaining isolates, and then the main isolate is allowed to exit.

Detail: Coverage info is shared between all isolates in an isolate group, so we actually gather coverage per-group. So when we're gathering coverage for all remaining isolate groups, we simply pick an arbitrary isolate from that group.

Fixes #2049

@liamappelbe liamappelbe requested a review from a team as a code owner April 9, 2025 03:31
Copy link

github-actions bot commented Apr 9, 2025

Package publishing

Package Version Status Publish tag (post-merge)
package:bazel_worker 1.1.3 already published at pub.dev
package:benchmark_harness 2.3.1 already published at pub.dev
package:boolean_selector 2.1.2 already published at pub.dev
package:browser_launcher 1.1.3 already published at pub.dev
package:cli_config 0.2.1-wip WIP (no publish necessary)
package:cli_util 0.4.2 already published at pub.dev
package:clock 1.1.2 already published at pub.dev
package:code_builder 4.10.1 already published at pub.dev
package:coverage 1.12.0-wip WIP (no publish necessary)
package:csslib 1.0.2 already published at pub.dev
package:extension_discovery 2.1.0 already published at pub.dev
package:file 7.0.2-wip WIP (no publish necessary)
package:file_testing 3.1.0-wip WIP (no publish necessary)
package:glob 2.1.3 already published at pub.dev
package:graphs 2.3.3-wip WIP (no publish necessary)
package:html 0.15.5+1 already published at pub.dev
package:io 1.1.0-wip WIP (no publish necessary)
package:json_rpc_2 3.0.3 already published at pub.dev
package:markdown 7.3.1-wip WIP (no publish necessary)
package:mime 2.0.0 already published at pub.dev
package:oauth2 2.0.4-wip WIP (no publish necessary)
package:package_config 2.3.0-wip WIP (no publish necessary)
package:pool 1.5.2-wip WIP (no publish necessary)
package:pub_semver 2.2.0 already published at pub.dev
package:pubspec_parse 1.5.0 already published at pub.dev
package:source_map_stack_trace 2.1.3-wip WIP (no publish necessary)
package:source_maps 0.10.14-wip WIP (no publish necessary)
package:source_span 1.10.1 already published at pub.dev
package:sse 4.1.7 already published at pub.dev
package:stack_trace 1.12.1 already published at pub.dev
package:stream_channel 2.1.4 already published at pub.dev
package:stream_transform 2.1.2-wip WIP (no publish necessary)
package:string_scanner 1.4.1 already published at pub.dev
package:term_glyph 1.2.3-wip WIP (no publish necessary)
package:test_reflective_loader 0.2.3 already published at pub.dev
package:timing 1.0.2 already published at pub.dev
package:unified_analytics 8.0.1 ready to publish unified_analytics-v8.0.1
package:watcher 1.1.1 already published at pub.dev
package:yaml 3.1.3 already published at pub.dev
package:yaml_edit 2.2.2 already published at pub.dev

Documentation at https://github.com/dart-lang/ecosystem/wiki/Publishing-automation.

@liamappelbe liamappelbe requested a review from bkonyi April 9, 2025 03:35
Copy link

github-actions bot commented Apr 9, 2025

PR Health

Breaking changes ✔️
Package Change Current Version New Version Needed Version Looking good?
coverage Non-Breaking 1.11.1 1.12.0-wip 1.12.0 ✔️
Changelog Entry ✔️
Package Changed Files

Changes to files need to be accounted for in their respective changelogs.

Coverage ✔️
File Coverage
pkgs/coverage/lib/src/isolate_paused_listener.dart 💚 98 % ⬆️ 0 %

This check for test coverage is informational (issues shown here will not fail the PR).

API leaks ✔️

The following packages contain symbols visible in the public API, but not exported by the library. Export these symbols or remove them from your publicly visible API.

Package Leaked API symbols
License Headers ✔️
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
Files
no missing headers

All source files should start with a license header.

Unrelated files missing license headers
Files
pkgs/bazel_worker/benchmark/benchmark.dart
pkgs/bazel_worker/example/client.dart
pkgs/bazel_worker/example/worker.dart
pkgs/benchmark_harness/integration_test/perf_benchmark_test.dart
pkgs/boolean_selector/example/example.dart
pkgs/clock/lib/clock.dart
pkgs/clock/lib/src/clock.dart
pkgs/clock/lib/src/default.dart
pkgs/clock/lib/src/stopwatch.dart
pkgs/clock/lib/src/utils.dart
pkgs/clock/test/clock_test.dart
pkgs/clock/test/default_test.dart
pkgs/clock/test/stopwatch_test.dart
pkgs/clock/test/utils.dart
pkgs/coverage/lib/src/coverage_options.dart
pkgs/coverage/test/collect_coverage_config_test.dart
pkgs/coverage/test/config_file_locator_test.dart
pkgs/html/example/main.dart
pkgs/html/lib/dom.dart
pkgs/html/lib/dom_parsing.dart
pkgs/html/lib/html_escape.dart
pkgs/html/lib/parser.dart
pkgs/html/lib/src/constants.dart
pkgs/html/lib/src/encoding_parser.dart
pkgs/html/lib/src/html_input_stream.dart
pkgs/html/lib/src/list_proxy.dart
pkgs/html/lib/src/query_selector.dart
pkgs/html/lib/src/token.dart
pkgs/html/lib/src/tokenizer.dart
pkgs/html/lib/src/treebuilder.dart
pkgs/html/lib/src/utils.dart
pkgs/html/test/dom_test.dart
pkgs/html/test/parser_feature_test.dart
pkgs/html/test/parser_test.dart
pkgs/html/test/query_selector_test.dart
pkgs/html/test/selectors/level1_baseline_test.dart
pkgs/html/test/selectors/level1_lib.dart
pkgs/html/test/selectors/selectors.dart
pkgs/html/test/support.dart
pkgs/html/test/tokenizer_test.dart
pkgs/pubspec_parse/test/git_uri_test.dart
pkgs/stack_trace/example/example.dart
pkgs/watcher/test/custom_watcher_factory_test.dart
pkgs/yaml_edit/example/example.dart

@liamappelbe liamappelbe merged commit e7168ae into main Apr 9, 2025
18 checks passed
@liamappelbe liamappelbe deleted the cov_iso_hang branch April 9, 2025 23:31
copybara-service bot pushed a commit to dart-lang/sdk that referenced this pull request Apr 16, 2025
Revisions updated by `dart tools/rev_sdk_deps.dart`.

ecosystem (https://github.com/dart-lang/ecosystem/compare/7f6f1c1..815d4ba):
  815d4ba  2025-04-15  Devon Carew  [firehose] don't fail publish validation if we see the pub pre-release warning (dart-lang/ecosystem#357)
  e7bae16  2025-04-15  Moritz  Fix label fetching (dart-lang/ecosystem#358)
  7aa1313  2025-04-15  Moritz  Fix PR label fetching (dart-lang/ecosystem#356)

test (https://github.com/dart-lang/test/compare/8643fbf..84eba11):
  84eba115  2025-04-11  Daco Harkes  [native assets] Add support for pub workspaces (dart-lang/test#2484)
  ab850972  2025-04-11  Daco Harkes  [native assets] Add support for pub workspaces
  9f9fd77d  2025-04-10  Nate Bosch  Migrate host.dart to new JS interop (dart-lang/test#2448)

tools (https://github.com/dart-lang/tools/compare/d74f9e1..4a28415):
  4a284152  2025-04-15  Moritz  [package:code_builder] Remove transitive dependency on package:macros (dart-lang/tools#2073)
  2bb6eba7  2025-04-11  Lasse R.H. Nielsen  Simplifies the format for client IDs. (dart-lang/tools#2072)
  77e41774  2025-04-10  Liam Appelbe  [coverage] Prepare to publish (dart-lang/tools#2070)
  e7168ae1  2025-04-10  Liam Appelbe  [coverage] Finish collection as soon as main isolate exits (dart-lang/tools#2069)

vector_math (https://github.com/google/vector_math.dart/compare/f08d7d2..dc9d379):
  dc9d379  2025-04-15  Lukas Klingsbo  chore: Remove test_all.dart since this is built-in to `dart test` (google/vector_math.dart#343)

webdev (https://github.com/dart-lang/webdev/compare/c8b1cfa..5bf833d):
  5bf833d0  2025-04-15  Srujan Gaddam  Support hot reload testing (dart-lang/webdev#2611)
  fa0b74bf  2025-04-14  Srujan Gaddam  Add support for hot restart tests in DWDS with the frontend server (dart-lang/webdev#2608)

Change-Id: Ic3ff6ed88ee2db935dc48fafe1e16a869d73506c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/422580
Reviewed-by: Ivan Inozemtsev <[email protected]>
Commit-Queue: Ivan Inozemtsev <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

dart pub global run coverage:test_with_coverage sometimes never terminates with tests that use async
2 participants