test(ci): ACKNACK HighestAcked と 待機中キャンセル テストの flaky を再修正#102
Merged
Conversation
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() される。
809ac06 to
61e422d
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
概要
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.待機中のキャンセルで_OperationCanceledExceptionAssert.Throws() Failure: No exception was thrown(5s 経過 = wait タイムアウト到達)根本原因
高負荷 CI (2-4 コア runner, maxParallelThreads=4) で ThreadPool が飢餓状態になり、
HeartbeatLoopAsyncやSendAckNackAsync(fire-and-forget Task) が大幅に遅延HighestAcked=0Task.Run + Task.Delay(50)によるcts.Cancel()も 5s 待っても発火せず修正内容
StatefulHandshakeTests.ACKNACK_で_writer_の_HighestAcked_が_進むdeadlineを 2s → 10s に延長MatchWaiterTests.待機中のキャンセルで_OperationCanceledExceptionTask.Run + Task.Delay(50)→ 専用 Thread +Thread.Sleep(50)ThreadPoolと独立にスケジュールされるため高負荷 CI でも 50ms 後に確実にcts.Cancel()検証
ローカルで 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_が_進む