From 40ce5bc1d9da31b49f42e488d2ab5633e7c6a3fb Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Sun, 22 Feb 2026 18:16:59 +0200 Subject: Implement sync_file_range coverage and document mage world bootstrap --- integrationtests/cmd/ioworkload/scenario_sync.go | 23 ++++ integrationtests/cmd/ioworkload/scenarios.go | 167 ++++++++++++----------- 2 files changed, 107 insertions(+), 83 deletions(-) (limited to 'integrationtests/cmd') 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) { -- cgit v1.2.3