Skip to content

test(ci): ACKNACK HighestAcked と 待機中キャンセル テストの flaky を再修正#102

Merged
OJII3 merged 1 commit into
mainfrom
fix/ci-flaky-handshake-tests
Jun 29, 2026
Merged

test(ci): ACKNACK HighestAcked と 待機中キャンセル テストの flaky を再修正#102
OJII3 merged 1 commit into
mainfrom
fix/ci-flaky-handshake-tests

Conversation

@OJII3

@OJII3 OJII3 commented Jun 29, 2026

Copy link
Copy Markdown
Owner

概要

main push (run 28364360641) で PR #92 の修正後も再発した flaky テスト 2 件を、根本原因 (ThreadPool 飢餓) を踏まえて再修正。

失敗していたテスト

  • ROSettaDDS.Tests.Rtps.StatefulHandshakeTests.ACKNACK_で_writer_の_HighestAcked_が_進む
    • Expected proxy.HighestAcked.Value to be 3L, but found 0L (3s 経過)
  • ROSettaDDS.Tests.Dds.MatchWaiterTests.待機中のキャンセルで_OperationCanceledException
    • Assert.Throws() Failure: No exception was thrown (5s 経過 = wait タイムアウト到達)

根本原因

高負荷 CI (2-4 コア runner, maxParallelThreads=4) で ThreadPool が飢餓状態になり、

  • 30ms 周期の HeartbeatLoopAsyncSendAckNackAsync (fire-and-forget Task) が大幅に遅延
  • 2s ポーリング内に HB→ACKNACK サイクルが完走せず HighestAcked=0
  • Task.Run + Task.Delay(50) による cts.Cancel() も 5s 待っても発火せず

修正内容

StatefulHandshakeTests.ACKNACK_で_writer_の_HighestAcked_が_進む

  • polling deadline を 2s → 10s に延長
  • polling 間隔を 20ms → 50ms に変更 (ThreadPool 圧迫軽減)
  • 高負荷 CI でも ack サイクル完走までの余裕を確保

MatchWaiterTests.待機中のキャンセルで_OperationCanceledException

検証

ローカルで 553 テスト全通過。修正対象 2 テストを 5 回連続実行でも 5/5 通過。

``"
Passed! - Failed: 0, Passed: 553, Skipped: 0, Total: 553
Passed ROSettaDDS.Tests.Dds.MatchWaiterTests.待機中のキャンセルで_OperationCanceledException
Passed ROSettaDDS.Tests.Rtps.StatefulHandshakeTests.ACKNACK_で_writer_の_HighestAcked_が_進む

PR #92 の修正後も main push (run 28364360641) で 2 件の flaky テスト
が再発したため、根本原因 (ThreadPool 飢餓) を踏まえて再修正。

* test(rtps): ACKNACK HighestAcked テストの polling deadline を 2s → 10s に延長

高負荷 CI (run 28364360641) で 30ms 周期の HeartbeatLoopAsync や
reader の SendAckNackAsync (fire-and-forget Task) が ThreadPool 枯渇で
大幅に遅延し、2s ポーリング内に HB→ACKNACK サイクルが完走せず
HighestAcked=0 のまま失敗していた。

deadline を 10s に広げ、polling 間隔も 20ms → 50ms に増やすことで、
ThreadPool が極度に詰まっている CI runner でも ack サイクルが
完走するまでの余裕を確保する。

* test(dds): 待機中キャンセル テストの cancelTask を Thread に変更

Task.Run + Task.Delay は PR #92 の修正後も高負荷 CI で 5s タイムアウト
まで発火せず、OperationCanceledException が出ないまま
WaitUntilMatchedAsync が false を返していた。

PR #92 で既に MatchWaiter ポーリングテストのポンプを Thread 化
しているのと同じ理由で、cancelTask も専用 Thread で発火させる。
Thread.Sleep(50) は ThreadPool とは独立にスケジュールされるため、
高負荷 CI でも 50ms 後に確実に cts.Cancel() される。
@OJII3 OJII3 force-pushed the fix/ci-flaky-handshake-tests branch from 809ac06 to 61e422d Compare June 29, 2026 12:40
@OJII3 OJII3 merged commit 1950e29 into main Jun 29, 2026
2 checks passed
@OJII3 OJII3 deleted the fix/ci-flaky-handshake-tests branch June 29, 2026 14:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant