From 1f9d25af8856c99fb7f3e8031c81c7e276de65cd Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sun, 9 Aug 2026 09:46:21 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=A7=B9=20[Code=20Health]=20Parallelize=20?= =?UTF-8?q?stale=20OpenCode=20review=20dismissals?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/ci/pr_review_merge_scheduler.py | 11 ++++++++++- tests/test_pr_review_merge_scheduler.py | 13 ++++++++++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/scripts/ci/pr_review_merge_scheduler.py b/scripts/ci/pr_review_merge_scheduler.py index 75e18c860c..50b90a8c1e 100644 --- a/scripts/ci/pr_review_merge_scheduler.py +++ b/scripts/ci/pr_review_merge_scheduler.py @@ -1356,7 +1356,8 @@ def dismiss_stale_opencode_change_requests(repo: str, pr: dict[str, Any], *, dry f"expected {expected_head}, observed {live_head or ''}" ) - for review_id in review_ids: + def dismiss_one(review_id: str) -> None: + """Dismiss a single stale review.""" message = ( "Superseded automated OpenCode change request from a previous head; " f"exact current head {expected_head} has a later OpenCode approval." @@ -1372,6 +1373,14 @@ def dismiss_stale_opencode_change_requests(repo: str, pr: dict[str, Any], *, dry f"message={message}", ] ) + + if len(review_ids) <= 1: + for review_id in review_ids: + dismiss_one(review_id) + else: + max_workers = min(REST_MERGEABLE_STATE_WORKERS, len(review_ids)) + with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor: + list(executor.map(dismiss_one, review_ids)) return len(review_ids) diff --git a/tests/test_pr_review_merge_scheduler.py b/tests/test_pr_review_merge_scheduler.py index 3e421e9039..7680d6aaa1 100644 --- a/tests/test_pr_review_merge_scheduler.py +++ b/tests/test_pr_review_merge_scheduler.py @@ -2604,9 +2604,16 @@ def test_dismiss_stale_opencode_change_requests_is_current_head_guarded(monkeypa monkeypatch.setenv("GH_TOKEN", "workflow-token") assert sched.dismiss_stale_opencode_change_requests("owner/repo", pr, dry_run=False) == 2 assert calls[0] == ["gh", "api", "repos/owner/repo/pulls/1", "--jq", ".head.sha"] - assert calls[1][:5] == ["gh", "api", "-X", "PUT", "repos/owner/repo/pulls/1/reviews/201/dismissals"] - assert calls[2][:5] == ["gh", "api", "-X", "PUT", "repos/owner/repo/pulls/1/reviews/202/dismissals"] - assert all(call[-2] == "-f" and call[-1].startswith("message=") for call in calls[1:]) + # Due to parallel execution, calls[1] and calls[2] may be in either order. + dismissal_endpoints = {calls[1][4], calls[2][4]} + assert dismissal_endpoints == { + "repos/owner/repo/pulls/1/reviews/201/dismissals", + "repos/owner/repo/pulls/1/reviews/202/dismissals" + } + for call in calls[1:]: + assert call[:4] == ["gh", "api", "-X", "PUT"] + assert call[-2] == "-f" + assert call[-1].startswith("message=") calls.clear() monkeypatch.setattr(sched, "run_github_read", lambda args, stdin=None: calls.append(args) or ("d" * 40))