summaryrefslogtreecommitdiff
path: root/internal/flags
diff options
context:
space:
mode:
Diffstat (limited to 'internal/flags')
-rw-r--r--internal/flags/flags.go2
-rw-r--r--internal/flags/sampling.go24
-rw-r--r--internal/flags/sampling_test.go26
3 files changed, 51 insertions, 1 deletions
diff --git a/internal/flags/flags.go b/internal/flags/flags.go
index 547ba8e..cc39638 100644
--- a/internal/flags/flags.go
+++ b/internal/flags/flags.go
@@ -265,7 +265,7 @@ func resolveSamplingRates(cfg *Config, familySampling, syscallSampling *string)
return err
}
cfg.SyscallFamilySamplingRates = familyRates
- cfg.SyscallSamplingRates = syscallRates
+ cfg.SyscallSamplingRates = mergeSyscallSamplingRates(syscallRates)
return nil
}
diff --git a/internal/flags/sampling.go b/internal/flags/sampling.go
index 19b4f9d..2f63ada 100644
--- a/internal/flags/sampling.go
+++ b/internal/flags/sampling.go
@@ -8,6 +8,14 @@ import (
"ior/internal/types"
)
+var defaultAggregateOnlySyscalls = []string{
+ "futex",
+ "futex_wait",
+ "futex_wake",
+ "futex_requeue",
+ "futex_waitv",
+}
+
func cloneFamilySamplingRates(in map[types.SyscallFamily]uint32) map[types.SyscallFamily]uint32 {
out := make(map[types.SyscallFamily]uint32, len(in))
for family, rate := range in {
@@ -24,6 +32,22 @@ func cloneSyscallSamplingRates(in map[string]uint32) map[string]uint32 {
return out
}
+func defaultSyscallSamplingRates() map[string]uint32 {
+ out := make(map[string]uint32, len(defaultAggregateOnlySyscalls))
+ for _, syscall := range defaultAggregateOnlySyscalls {
+ out[syscall] = 0
+ }
+ return out
+}
+
+func mergeSyscallSamplingRates(overrides map[string]uint32) map[string]uint32 {
+ out := defaultSyscallSamplingRates()
+ for syscall, rate := range overrides {
+ out[syscall] = rate
+ }
+ return out
+}
+
func parseFamilySamplingRates(raw string) (map[types.SyscallFamily]uint32, error) {
entries, err := parseSamplingEntries(raw)
if err != nil {
diff --git a/internal/flags/sampling_test.go b/internal/flags/sampling_test.go
index 0966c0f..82a43ec 100644
--- a/internal/flags/sampling_test.go
+++ b/internal/flags/sampling_test.go
@@ -76,3 +76,29 @@ func TestCloneDeepCopiesSamplingMaps(t *testing.T) {
t.Fatalf("original syscall rate mutated: got %d, want 9", got)
}
}
+
+func TestDefaultSamplingRatesIncludeFutexAggregateOnly(t *testing.T) {
+ cfg, err := parseForTest(t)
+ if err != nil {
+ t.Fatalf("parse returned error: %v", err)
+ }
+ for _, syscall := range []string{"futex", "futex_wait", "futex_wake", "futex_requeue", "futex_waitv"} {
+ rate, ok := cfg.SyscallSamplingRates[syscall]
+ if !ok {
+ t.Fatalf("expected default sampling entry for %s", syscall)
+ }
+ if rate != 0 {
+ t.Fatalf("%s default rate = %d, want 0 (aggregate-only)", syscall, rate)
+ }
+ }
+}
+
+func TestParseSamplingRatesOverrideDefaultFutexRate(t *testing.T) {
+ cfg, err := parseForTest(t, "-syscall-sampling-syscalls", "futex=7")
+ if err != nil {
+ t.Fatalf("parse returned error: %v", err)
+ }
+ if got := cfg.SyscallSamplingRates["futex"]; got != 7 {
+ t.Fatalf("futex rate = %d, want 7", got)
+ }
+}