summaryrefslogtreecommitdiff
path: root/integrationtests
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-02-22 18:16:59 +0200
committerPaul Buetow <paul@buetow.org>2026-02-22 18:16:59 +0200
commit40ce5bc1d9da31b49f42e488d2ab5633e7c6a3fb (patch)
tree33c6197180648d80f0e71b14803e102522059be5 /integrationtests
parent3ec3c117bb280a377fea1a3eef84a70e2a3d4150 (diff)
Implement sync_file_range coverage and document mage world bootstrap
Diffstat (limited to 'integrationtests')
-rw-r--r--integrationtests/cmd/ioworkload/scenario_sync.go23
-rw-r--r--integrationtests/cmd/ioworkload/scenarios.go167
-rw-r--r--integrationtests/sync_test.go11
3 files changed, 118 insertions, 83 deletions
diff --git a/integrationtests/cmd/ioworkload/scenario_sync.go b/integrationtests/cmd/ioworkload/scenario_sync.go
index 214c783..db6b08f 100644
--- a/integrationtests/cmd/ioworkload/scenario_sync.go
+++ b/integrationtests/cmd/ioworkload/scenario_sync.go
@@ -77,6 +77,29 @@ func syncSyncFileRange() error {
return syscall.SyncFileRange(fd, 0, int64(len(data)), 0)
}
+// syncSyncFileRangeToEOF calls sync_file_range(2) with nbytes=0.
+// Per sync_file_range(2), nbytes=0 means "sync from offset through end-of-file".
+func syncSyncFileRangeToEOF() error {
+ dir, cleanup, err := makeTempDir("sync-sync-file-range-to-eof")
+ if err != nil {
+ return err
+ }
+ defer cleanup()
+
+ path := filepath.Join(dir, "syncrangeeoffile.txt")
+ fd, err := syscall.Open(path, syscall.O_RDWR|syscall.O_CREAT, 0o644)
+ if err != nil {
+ return fmt.Errorf("open: %w", err)
+ }
+ defer syscall.Close(fd)
+
+ if _, err := syscall.Write(fd, []byte("sync file range to eof")); err != nil {
+ return fmt.Errorf("write: %w", err)
+ }
+
+ return syscall.SyncFileRange(fd, 0, 0, 0)
+}
+
// syncFsyncEbadf calls fsync on an invalid fd.
// The syscall fails with EBADF, but ior captures the enter_fsync tracepoint.
func syncFsyncEbadf() error {
diff --git a/integrationtests/cmd/ioworkload/scenarios.go b/integrationtests/cmd/ioworkload/scenarios.go
index 0103c6d..4bd85b6 100644
--- a/integrationtests/cmd/ioworkload/scenarios.go
+++ b/integrationtests/cmd/ioworkload/scenarios.go
@@ -7,89 +7,90 @@ import (
// scenarios maps scenario names to their execution functions.
var scenarios = map[string]func() error{
- "crash": crash,
- "open-basic": openBasic,
- "open-creat": openCreat,
- "open-by-handle-at": openByHandleAt,
- "open-enoent": openEnoent,
- "open-rdonly-write": openRdonlyWrite,
- "open-pid-filter": openPidFilter,
- "readwrite-basic": readwriteBasic,
- "readwrite-pread": readwritePread,
- "readwrite-pwrite": readwritePwrite,
- "readwrite-readv": readwriteReadv,
- "readwrite-writev": readwriteWritev,
- "readwrite-wronly-read": readwriteWronlyRead,
- "readwrite-rdonly-write": readwriteRdonlyWrite,
- "readwrite-pread-invalid": readwritePreadInvalid,
- "readwrite-pwrite-invalid": readwritePwriteInvalid,
- "close-basic": closeBasic,
- "close-range": closeRange,
- "close-invalid-fd": closeInvalidFd,
- "close-double-close": closeDoubleClose,
- "close-range-empty": closeRangeEmpty,
- "dup-basic": dupBasic,
- "dup-dup2": dupDup2,
- "dup-dup3": dupDup3,
- "dup-invalid-fd": dupInvalidFd,
- "dup2-same-fd": dup2SameFd,
- "dup3-invalid-flags": dup3InvalidFlags,
- "fcntl-dupfd": fcntlDupfd,
- "fcntl-setfl": fcntlSetfl,
- "fcntl-dupfd-cloexec": fcntlDupfdCloexec,
- "fcntl-invalid-fd": fcntlInvalidFd,
- "fcntl-dupfd-max": fcntlDupfdMax,
- "rename-basic": renameBasic,
- "rename-renameat": renameRenameat,
- "rename-renameat2": renameRenameat2,
- "rename-enoent": renameEnoent,
- "rename-noreplace": renameNoreplace,
- "link-basic": linkBasic,
- "link-linkat": linkLinkat,
- "link-symlinkat": linkSymlinkat,
- "link-readlinkat": linkReadlinkat,
- "link-enoent": linkEnoent,
- "link-symlink-eexist": linkSymlinkEexist,
- "link-readlinkat-einval": linkReadlinkatEinval,
- "unlink-basic": unlinkBasic,
- "unlink-unlinkat": unlinkUnlinkat,
- "unlink-rmdir": unlinkRmdir,
- "unlink-enoent": unlinkEnoent,
- "unlink-rmdir-notempty": unlinkRmdirNotempty,
- "unlink-unlinkat-enoent": unlinkUnlinkatEnoent,
- "dir-basic": dirBasic,
- "dir-mkdirat": dirMkdirat,
- "dir-chdir": dirChdir,
- "dir-getdents": dirGetdents,
- "dir-mkdir-eexist": dirMkdirEexist,
- "dir-chdir-enoent": dirChdirEnoent,
- "dir-getdents-ebadf": dirGetdentsEbadf,
- "stat-basic": statBasic,
- "stat-fstat": statFstat,
- "stat-lstat": statLstat,
- "stat-newfstatat": statNewfstatat,
- "stat-statx": statStatx,
- "stat-access": statAccess,
- "stat-faccessat": statFaccessat,
- "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-fsync-ebadf": syncFsyncEbadf,
- "sync-fdatasync-ebadf": syncFdatasyncEbadf,
- "sync-file-range-ebadf": syncFileRangeEbadf,
- "truncate-basic": truncateBasic,
- "truncate-ftruncate": truncateFtruncate,
- "truncate-enoent": truncateEnoent,
- "truncate-ftruncate-ebadf": truncateFtruncateEbadf,
- "iouring-setup": iouringSetup,
- "iouring-enter": iouringEnter,
- "iouring-register": iouringRegister,
- "iouring-enter-ebadf": iouringEnterEbadf,
- "iouring-register-ebadf": iouringRegisterEbadf,
+ "crash": crash,
+ "open-basic": openBasic,
+ "open-creat": openCreat,
+ "open-by-handle-at": openByHandleAt,
+ "open-enoent": openEnoent,
+ "open-rdonly-write": openRdonlyWrite,
+ "open-pid-filter": openPidFilter,
+ "readwrite-basic": readwriteBasic,
+ "readwrite-pread": readwritePread,
+ "readwrite-pwrite": readwritePwrite,
+ "readwrite-readv": readwriteReadv,
+ "readwrite-writev": readwriteWritev,
+ "readwrite-wronly-read": readwriteWronlyRead,
+ "readwrite-rdonly-write": readwriteRdonlyWrite,
+ "readwrite-pread-invalid": readwritePreadInvalid,
+ "readwrite-pwrite-invalid": readwritePwriteInvalid,
+ "close-basic": closeBasic,
+ "close-range": closeRange,
+ "close-invalid-fd": closeInvalidFd,
+ "close-double-close": closeDoubleClose,
+ "close-range-empty": closeRangeEmpty,
+ "dup-basic": dupBasic,
+ "dup-dup2": dupDup2,
+ "dup-dup3": dupDup3,
+ "dup-invalid-fd": dupInvalidFd,
+ "dup2-same-fd": dup2SameFd,
+ "dup3-invalid-flags": dup3InvalidFlags,
+ "fcntl-dupfd": fcntlDupfd,
+ "fcntl-setfl": fcntlSetfl,
+ "fcntl-dupfd-cloexec": fcntlDupfdCloexec,
+ "fcntl-invalid-fd": fcntlInvalidFd,
+ "fcntl-dupfd-max": fcntlDupfdMax,
+ "rename-basic": renameBasic,
+ "rename-renameat": renameRenameat,
+ "rename-renameat2": renameRenameat2,
+ "rename-enoent": renameEnoent,
+ "rename-noreplace": renameNoreplace,
+ "link-basic": linkBasic,
+ "link-linkat": linkLinkat,
+ "link-symlinkat": linkSymlinkat,
+ "link-readlinkat": linkReadlinkat,
+ "link-enoent": linkEnoent,
+ "link-symlink-eexist": linkSymlinkEexist,
+ "link-readlinkat-einval": linkReadlinkatEinval,
+ "unlink-basic": unlinkBasic,
+ "unlink-unlinkat": unlinkUnlinkat,
+ "unlink-rmdir": unlinkRmdir,
+ "unlink-enoent": unlinkEnoent,
+ "unlink-rmdir-notempty": unlinkRmdirNotempty,
+ "unlink-unlinkat-enoent": unlinkUnlinkatEnoent,
+ "dir-basic": dirBasic,
+ "dir-mkdirat": dirMkdirat,
+ "dir-chdir": dirChdir,
+ "dir-getdents": dirGetdents,
+ "dir-mkdir-eexist": dirMkdirEexist,
+ "dir-chdir-enoent": dirChdirEnoent,
+ "dir-getdents-ebadf": dirGetdentsEbadf,
+ "stat-basic": statBasic,
+ "stat-fstat": statFstat,
+ "stat-lstat": statLstat,
+ "stat-newfstatat": statNewfstatat,
+ "stat-statx": statStatx,
+ "stat-access": statAccess,
+ "stat-faccessat": statFaccessat,
+ "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-sync-file-range-to-eof": syncSyncFileRangeToEOF,
+ "sync-fsync-ebadf": syncFsyncEbadf,
+ "sync-fdatasync-ebadf": syncFdatasyncEbadf,
+ "sync-file-range-ebadf": syncFileRangeEbadf,
+ "truncate-basic": truncateBasic,
+ "truncate-ftruncate": truncateFtruncate,
+ "truncate-enoent": truncateEnoent,
+ "truncate-ftruncate-ebadf": truncateFtruncateEbadf,
+ "iouring-setup": iouringSetup,
+ "iouring-enter": iouringEnter,
+ "iouring-register": iouringRegister,
+ "iouring-enter-ebadf": iouringEnterEbadf,
+ "iouring-register-ebadf": iouringRegisterEbadf,
}
func makeTempDir(prefix string) (string, func(), error) {
diff --git a/integrationtests/sync_test.go b/integrationtests/sync_test.go
index 763f3c2..ce0a461 100644
--- a/integrationtests/sync_test.go
+++ b/integrationtests/sync_test.go
@@ -45,6 +45,17 @@ func TestSyncSyncFileRange(t *testing.T) {
})
}
+func TestSyncSyncFileRangeToEOF(t *testing.T) {
+ runScenario(t, "sync-sync-file-range-to-eof", []ExpectedEvent{
+ {
+ PathContains: "syncrangeeoffile.txt",
+ Tracepoint: "enter_sync_file_range",
+ Comm: "ioworkload",
+ MinCount: 1,
+ },
+ })
+}
+
func TestSyncFsyncEbadf(t *testing.T) {
runScenario(t, "sync-fsync-ebadf", []ExpectedEvent{
{