diff options
| author | Paul Buetow <paul@buetow.org> | 2026-05-19 09:47:09 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-05-19 09:47:09 +0300 |
| commit | 5bd44dcb1e588fd5df8c02aec58353f7aa8f7d13 (patch) | |
| tree | d4059fce1d43a1f0f0815d753b627802e7599b13 /cmd/ioworkload | |
| parent | d699ef44a9ded5d419a470a4f6715ecff7f0fcd1 (diff) | |
t6 stabilize family recording integration
Diffstat (limited to 'cmd/ioworkload')
| -rw-r--r-- | cmd/ioworkload/main.go | 20 | ||||
| -rw-r--r-- | cmd/ioworkload/scenario_family.go | 23 |
2 files changed, 36 insertions, 7 deletions
diff --git a/cmd/ioworkload/main.go b/cmd/ioworkload/main.go index 0276a9c..57424e4 100644 --- a/cmd/ioworkload/main.go +++ b/cmd/ioworkload/main.go @@ -8,13 +8,17 @@ import ( "fmt" "os" "slices" + "strconv" "time" ) // Give ior enough time to attach tracepoints before scenarios emit syscalls. // Under slower CI or locally saturated systems, 5s can still miss first-call // events for single-shot scenarios. Use a slightly larger delay for stability. -const startupDelay = 8 * time.Second +const ( + defaultStartupDelay = 8 * time.Second + startupDelayEnv = "IOR_WORKLOAD_STARTUP_DELAY_MS" +) func main() { scenario := flag.String("scenario", "", "I/O scenario to execute") @@ -40,10 +44,22 @@ func main() { } fmt.Println(os.Getpid()) - time.Sleep(startupDelay) + time.Sleep(configuredStartupDelay()) if err := run(); err != nil { fmt.Fprintf(os.Stderr, "scenario %s failed: %v\n", *scenario, err) os.Exit(1) } } + +func configuredStartupDelay() time.Duration { + raw := os.Getenv(startupDelayEnv) + if raw == "" { + return defaultStartupDelay + } + ms, err := strconv.Atoi(raw) + if err != nil || ms < 0 { + return defaultStartupDelay + } + return time.Duration(ms) * time.Millisecond +} diff --git a/cmd/ioworkload/scenario_family.go b/cmd/ioworkload/scenario_family.go index c550b4b..21d58e8 100644 --- a/cmd/ioworkload/scenario_family.go +++ b/cmd/ioworkload/scenario_family.go @@ -4,11 +4,27 @@ import ( "fmt" "path/filepath" "syscall" + "time" ) +const familyMixedEmitFor = 3 * time.Second + // familyMixed emits representative syscalls from multiple broad families so // integration tests can verify family tagging and aggregation from a real trace. func familyMixed() error { + deadline := time.Now().Add(familyMixedEmitFor) + for { + if err := familyMixedOnce(); err != nil { + return err + } + if time.Now().After(deadline) { + return nil + } + time.Sleep(25 * time.Millisecond) + } +} + +func familyMixedOnce() error { if err := familyMixedFS(); err != nil { return err } @@ -21,10 +37,7 @@ func familyMixed() error { if err := familyMixedNetwork(); err != nil { return err } - if err := familyMixedProcessSchedTime(); err != nil { - return err - } - return nil + return familyMixedProcessSchedTime() } func familyMixedFS() error { @@ -83,7 +96,7 @@ func familyMixedProcessSchedTime() error { if _, _, errno := syscall.RawSyscall(syscall.SYS_SCHED_YIELD, 0, 0, 0); errno != 0 { return fmt.Errorf("sched_yield: %w", errno) } - if err := syscall.Nanosleep(&syscall.Timespec{Nsec: 1000}, nil); err != nil { + if err := syscall.Nanosleep(&syscall.Timespec{Nsec: 1000}, nil); err != nil && err != syscall.EINTR { return fmt.Errorf("nanosleep: %w", err) } return nil |
