diff options
| author | Paul Buetow <paul@buetow.org> | 2026-02-21 21:39:18 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-02-21 21:39:18 +0200 |
| commit | d455543bf0838c7fe2250081c5ea8ed3e275d236 (patch) | |
| tree | b34542ab4761c686d43938034c7d3960c3f0d8ba | |
| parent | 065389bac04c71a5dd5f44b2cfe5fe801bafabab (diff) | |
Add negative integration tests for sync syscalls (task 348)
Add three EBADF scenarios testing ior's ability to capture sync-related
tracepoints even when the underlying syscall fails:
- sync-fsync-ebadf: fsync on invalid fd, expects enter_fsync
- sync-fdatasync-ebadf: fdatasync on invalid fd, expects enter_fdatasync
- sync-file-range-ebadf: sync_file_range on invalid fd, expects enter_sync_file_range
Amp-Thread-ID: https://ampcode.com/threads/T-019c81b4-216a-732c-90b1-e6771e27ed75
Co-authored-by: Amp <amp@ampcode.com>
| -rw-r--r-- | integrationtests/cmd/ioworkload/scenarios.go | 41 | ||||
| -rw-r--r-- | integrationtests/sync_test.go | 30 |
2 files changed, 67 insertions, 4 deletions
diff --git a/integrationtests/cmd/ioworkload/scenarios.go b/integrationtests/cmd/ioworkload/scenarios.go index 3f5ee4c..58c78e1 100644 --- a/integrationtests/cmd/ioworkload/scenarios.go +++ b/integrationtests/cmd/ioworkload/scenarios.go @@ -79,10 +79,13 @@ var scenarios = map[string]func() error{ "stat-enoent": statEnoent, "stat-access-enoent": statAccessEnoent, "stat-fstat-ebadf": statFstatEbadf, - "sync-basic": syncBasic, - "sync-fdatasync": syncFdatasync, - "sync-sync": syncSync, - "sync-sync-file-range": syncSyncFileRange, + "sync-basic": syncBasic, + "sync-fdatasync": syncFdatasync, + "sync-sync": syncSync, + "sync-sync-file-range": syncSyncFileRange, + "sync-fsync-ebadf": syncFsyncEbadf, + "sync-fdatasync-ebadf": syncFdatasyncEbadf, + "sync-file-range-ebadf": syncFileRangeEbadf, "truncate-basic": truncateBasic, "truncate-ftruncate": truncateFtruncate, "iouring-setup": iouringSetup, @@ -2146,6 +2149,36 @@ func syncSyncFileRange() error { return syscall.SyncFileRange(fd, 0, int64(len(data)), 0) } +// syncFsyncEbadf calls fsync on an invalid fd. +// The syscall fails with EBADF, but ior captures the enter_fsync tracepoint. +func syncFsyncEbadf() error { + _, _, errno := syscall.Syscall(syscall.SYS_FSYNC, 99999, 0, 0) + if errno == 0 { + return fmt.Errorf("expected EBADF, but fsync succeeded") + } + return nil +} + +// syncFdatasyncEbadf calls fdatasync on an invalid fd. +// The syscall fails with EBADF, but ior captures the enter_fdatasync tracepoint. +func syncFdatasyncEbadf() error { + _, _, errno := syscall.Syscall(syscall.SYS_FDATASYNC, 99999, 0, 0) + if errno == 0 { + return fmt.Errorf("expected EBADF, but fdatasync succeeded") + } + return nil +} + +// syncFileRangeEbadf calls sync_file_range on an invalid fd. +// The syscall fails with EBADF, but ior captures the enter_sync_file_range tracepoint. +func syncFileRangeEbadf() error { + _, _, errno := syscall.Syscall6(syscall.SYS_SYNC_FILE_RANGE, 99999, 0, 0, 0, 0, 0) + if errno == 0 { + return fmt.Errorf("expected EBADF, but sync_file_range succeeded") + } + return nil +} + // truncateBasic opens a file, writes data, then truncates it via // syscall.Truncate which uses SYS_TRUNCATE directly on amd64 (path-based). func truncateBasic() error { diff --git a/integrationtests/sync_test.go b/integrationtests/sync_test.go index 5f6a314..763f3c2 100644 --- a/integrationtests/sync_test.go +++ b/integrationtests/sync_test.go @@ -44,3 +44,33 @@ func TestSyncSyncFileRange(t *testing.T) { }, }) } + +func TestSyncFsyncEbadf(t *testing.T) { + runScenario(t, "sync-fsync-ebadf", []ExpectedEvent{ + { + Tracepoint: "enter_fsync", + Comm: "ioworkload", + MinCount: 1, + }, + }) +} + +func TestSyncFdatasyncEbadf(t *testing.T) { + runScenario(t, "sync-fdatasync-ebadf", []ExpectedEvent{ + { + Tracepoint: "enter_fdatasync", + Comm: "ioworkload", + MinCount: 1, + }, + }) +} + +func TestSyncFileRangeEbadf(t *testing.T) { + runScenario(t, "sync-file-range-ebadf", []ExpectedEvent{ + { + Tracepoint: "enter_sync_file_range", + Comm: "ioworkload", + MinCount: 1, + }, + }) +} |
