diff options
Diffstat (limited to 'internal/flags')
| -rw-r--r-- | internal/flags/flags.go | 2 | ||||
| -rw-r--r-- | internal/flags/sampling.go | 24 | ||||
| -rw-r--r-- | internal/flags/sampling_test.go | 26 |
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) + } +} |
