summaryrefslogtreecommitdiff
path: root/cmd/ioworkload
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-19 09:47:09 +0300
committerPaul Buetow <paul@buetow.org>2026-05-19 09:47:09 +0300
commit5bd44dcb1e588fd5df8c02aec58353f7aa8f7d13 (patch)
treed4059fce1d43a1f0f0815d753b627802e7599b13 /cmd/ioworkload
parentd699ef44a9ded5d419a470a4f6715ecff7f0fcd1 (diff)
t6 stabilize family recording integration
Diffstat (limited to 'cmd/ioworkload')
-rw-r--r--cmd/ioworkload/main.go20
-rw-r--r--cmd/ioworkload/scenario_family.go23
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