Skip to content

Commit 795c8cf

Browse files
committed
test(nvlink): cover post-RX dedup paths
1 parent 75ca990 commit 795c8cf

4 files changed

Lines changed: 35 additions & 5 deletions

File tree

components/accelerator/nvidia/nvlink/kmsg.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@ const (
77
// update an NVLink post-RX-detection link mask.
88
EventNamePostRxDetectFailure = "nvlink_post_rx_detect_failure"
99

10-
// NVIDIA's published GH100 kernel source emits these errors when updating a
11-
// post-RX-detection link mask fails. The source does not classify this error
12-
// as a driver hang.
10+
// NVIDIA's published GH100 discovery path calls
11+
// knvlinkUpdatePostRxDetectLinkMask and reports the peer-mask failure when
12+
// that update fails. Some driver builds also emit the paired update failure.
13+
// The source does not classify this error as a driver hang.
1314
// ref. https://github.com/NVIDIA/open-gpu-kernel-modules/blob/452cec62d827034798072827d3866d1881662b77/src/nvidia/src/kernel/gpu/nvlink/arch/hopper/kernel_nvlink_gh100.c#L173-L249
1415
RegexPostRxDetectFailureKMessage = `NVRM: (?:knvlinkUpdatePostRxDetectLinkMask_[A-Za-z0-9_]+: Failed to update Rx Detect Link mask!|knvlinkDiscoverPostRxDetLinks_[A-Za-z0-9_]+: Getting peer[0-9]+(?:'s)? postRxDetLinkMask failed!)`
1516

components/accelerator/nvidia/nvlink/kmsg_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ func TestMatch(t *testing.T) {
1717
line: "NVRM: knvlinkDiscoverPostRxDetLinks_GH100: Getting peer0's postRxDetLinkMask failed!",
1818
match: true,
1919
},
20+
{
21+
name: "incident link-mask update signature",
22+
line: "NVRM: knvlinkUpdatePostRxDetectLinkMask_IMPL: Failed to update Rx Detect Link mask!",
23+
match: true,
24+
},
2025
{
2126
name: "other GPU architecture and peer",
2227
line: "kernel: NVRM: knvlinkDiscoverPostRxDetLinks_GB100_REV2: Getting peer17 postRxDetLinkMask failed!",

components/accelerator/nvidia/nvlink/mock_component_test.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"errors"
66
"os"
7+
"reflect"
78
"runtime"
89
"testing"
910
"time"
@@ -27,13 +28,15 @@ func TestNew_WithEventStoreAsRoot_KmsgSyncer_WithMockey(t *testing.T) {
2728

2829
bucket := &memoryEventBucket{}
2930
var match kmsg.MatchFunc
31+
var syncerOpts []kmsg.OpOption
3032
mockey.Mock(kmsg.NewSyncer).To(func(
3133
_ context.Context,
3234
matchFunc kmsg.MatchFunc,
3335
eventBucket eventstore.Bucket,
34-
_ ...kmsg.OpOption,
36+
opts ...kmsg.OpOption,
3537
) (*kmsg.Syncer, error) {
3638
match = matchFunc
39+
syncerOpts = opts
3740
assert.Same(t, bucket, eventBucket)
3841
return &kmsg.Syncer{}, nil
3942
}).Build()
@@ -48,6 +51,8 @@ func TestNew_WithEventStoreAsRoot_KmsgSyncer_WithMockey(t *testing.T) {
4851
require.NotNil(t, c.kmsgSyncer)
4952
assert.Nil(t, c.readAllKmsg, "daemon components should rely on the kmsg syncer")
5053
require.NotNil(t, match)
54+
require.Len(t, syncerOpts, 1)
55+
assert.Equal(t, int(defaultKmsgEventDedupWindow.Seconds()), getKmsgCacheKeyTruncateSeconds(t, syncerOpts[0]))
5156

5257
name, message := match("NVRM: knvlinkDiscoverPostRxDetLinks_GH100: Getting peer0's postRxDetLinkMask failed!")
5358
assert.Equal(t, EventNamePostRxDetectFailure, name)
@@ -63,6 +68,17 @@ func TestNew_WithEventStoreAsRoot_KmsgSyncer_WithMockey(t *testing.T) {
6368
})
6469
}
6570

71+
func getKmsgCacheKeyTruncateSeconds(t *testing.T, opt kmsg.OpOption) int {
72+
t.Helper()
73+
op := &kmsg.Op{}
74+
opt(op)
75+
76+
v := reflect.ValueOf(op).Elem().FieldByName("cacheKeyTruncateSeconds")
77+
require.True(t, v.IsValid(), "cacheKeyTruncateSeconds field must exist")
78+
require.Equal(t, reflect.Int, v.Kind(), "cacheKeyTruncateSeconds must be int")
79+
return int(v.Int())
80+
}
81+
6682
func TestNew_WithEventStoreAsRoot_KmsgSyncerError_WithMockey(t *testing.T) {
6783
mockey.PatchConvey("New cleans up when the kmsg syncer cannot be created", t, func() {
6884
mockey.Mock(os.Geteuid).Return(0).Build()

components/accelerator/nvidia/nvlink/post_rx_detect_failure_test.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,9 @@ func TestCheckDetectsAndDeduplicatesPostRxDetectFailureForOneShotScan(t *testing
213213
{Timestamp: metav1.NewTime(baseTime.Add(8*time.Second + 3827*time.Microsecond)), Message: "[6619723.539539] NVRM: knvlinkDiscoverPostRxDetLinks_GH100: Getting peer0's postRxDetLinkMask failed!"},
214214
}
215215
for _, message := range reportedKmsgs {
216-
assert.True(t, HasPostRxDetectFailure(message.Message), message.Message)
216+
eventName, eventMessage := Match(message.Message)
217+
assert.Equal(t, EventNamePostRxDetectFailure, eventName, message.Message)
218+
assert.Equal(t, postRxDetectFailureMessage, eventMessage, message.Message)
217219
}
218220
c.readAllKmsg = func(context.Context) ([]kmsg.Message, error) {
219221
return reportedKmsgs, nil
@@ -228,6 +230,12 @@ func TestCheckDetectsAndDeduplicatesPostRxDetectFailureForOneShotScan(t *testing
228230
state := result.HealthStates()[0]
229231
require.NotNil(t, state.SuggestedActions)
230232
assert.Equal(t, []apiv1.RepairActionType{apiv1.RepairActionTypeRebootSystem}, state.SuggestedActions.RepairActions)
233+
234+
reportedKmsgs = append(reportedKmsgs, kmsg.Message{
235+
Timestamp: metav1.NewTime(baseTime.Add(defaultKmsgEventDedupWindow)),
236+
Message: "NVRM: knvlinkUpdatePostRxDetectLinkMask_IMPL: Failed to update Rx Detect Link mask!",
237+
})
238+
assert.Equal(t, "matched 2 kmsg(s)", c.Check().String(), "a later dedup window should report the failure again")
231239
}
232240

233241
func TestCheckHandlesOneShotKmsgReadResult(t *testing.T) {

0 commit comments

Comments
 (0)