Skip to content

Commit 6c3fcbd

Browse files
authored
Fix preempt reclaim minruntime string parsing (#278)
* using str2duration lib to parse min runtime duration to support more cases * validate the duration is not negative * added tests for parseMinRuntime * little fix in test
1 parent 30e7427 commit 6c3fcbd

File tree

4 files changed

+58
-1
lines changed

4 files changed

+58
-1
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ require (
2323
github.com/run-ai/kwok-operator v0.0.0-20240926063032-05b6364bc7c7
2424
github.com/spf13/pflag v1.0.6
2525
github.com/stretchr/testify v1.10.0
26+
github.com/xhit/go-str2duration/v2 v2.1.0
2627
github.com/xyproto/randomstring v1.2.0
2728
go.uber.org/mock v0.5.0
2829
go.uber.org/multierr v1.11.0

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,8 @@ github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65E
327327
github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
328328
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
329329
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
330+
github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc=
331+
github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU=
330332
github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510 h1:S2dVYn90KE98chqDkyE9Z4N61UnQd+KOfgp5Iu53llk=
331333
github.com/xiang90/probing v0.0.0-20221125231312-a49e3df8f510/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
332334
github.com/xyproto/randomstring v1.2.0 h1:y7PXAEBM3XlwJjPG2JQg4voxBYZ4+hPgRdGKCfU8wik=

pkg/scheduler/plugins/minruntime/minruntime.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
package minruntime
55

66
import (
7+
"github.com/xhit/go-str2duration/v2"
78
"slices"
89
"time"
910

@@ -41,11 +42,17 @@ func parseMinRuntime(arguments map[string]string, minRuntimeConfig string) metav
4142
if len(minRuntime) == 0 {
4243
return metav1.Duration{Duration: 0 * time.Second}
4344
}
44-
duration, err := time.ParseDuration(minRuntime)
45+
duration, err := str2duration.ParseDuration(minRuntime)
4546
if err != nil {
4647
log.InfraLogger.Errorf("Failed to parse %v (%v): %v, using default value 0s", minRuntimeConfig, minRuntime, err)
4748
duration = 0 * time.Second
4849
}
50+
51+
if duration < 0 {
52+
log.InfraLogger.Errorf("Parsed %v (%v) is negative, using default value 0s", minRuntimeConfig, minRuntime)
53+
duration = 0 * time.Second
54+
}
55+
4956
return metav1.Duration{Duration: duration}
5057
}
5158

pkg/scheduler/plugins/minruntime/minruntime_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,4 +333,51 @@ var _ = Describe("MinRuntime Plugin", func() {
333333
})
334334
})
335335
})
336+
337+
Describe("parseMinRuntime", func() {
338+
It("Sanity - parse passes", func() {
339+
// Test various valid min runtime strings
340+
validDurations := []string{
341+
"5s", "10s", "10m5s", "1m", "1.5s", "2m30s", "1h", "1h30m", "2h45m15s", "2d4h30m", "5w4d12h",
342+
}
343+
344+
args := map[string]string{}
345+
346+
for _, durationStr := range validDurations {
347+
args[defaultReclaimMinRuntimeConfig] = durationStr
348+
duration := parseMinRuntime(args, defaultReclaimMinRuntimeConfig)
349+
Expect(duration).ToNot(BeZero(), fmt.Sprintf("Expected non-zero duration for %s", durationStr))
350+
}
351+
})
352+
353+
It("Invalid durations should return zero", func() {
354+
// Test various invalid min runtime strings
355+
invalidDurations := []string{
356+
"5", "1h2", "2h45m15", "abc", "1h-30m", "dfdsfdfdf",
357+
}
358+
359+
args := map[string]string{}
360+
361+
for _, durationStr := range invalidDurations {
362+
args[defaultPreemptMinRuntimeConfig] = durationStr
363+
duration := parseMinRuntime(args, defaultPreemptMinRuntimeConfig)
364+
Expect(duration).To(BeZero(), fmt.Sprintf("Expected zero duration for invalid %s", durationStr))
365+
}
366+
})
367+
368+
It("Invalid negative durations", func() {
369+
// Test negative durations
370+
negativeDurations := []string{
371+
"-5s", "-10m", "-1h", "-2d", "-3w",
372+
}
373+
374+
args := map[string]string{}
375+
376+
for _, durationStr := range negativeDurations {
377+
args[defaultReclaimMinRuntimeConfig] = durationStr
378+
duration := parseMinRuntime(args, defaultReclaimMinRuntimeConfig)
379+
Expect(duration).To(BeZero(), fmt.Sprintf("Expected zero duration for negative %s", durationStr))
380+
}
381+
})
382+
})
336383
})

0 commit comments

Comments
 (0)