summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
Diffstat (limited to 'cmd')
-rw-r--r--cmd/ioworkload/scenario_socket.go45
-rw-r--r--cmd/ioworkload/scenarios.go197
2 files changed, 144 insertions, 98 deletions
diff --git a/cmd/ioworkload/scenario_socket.go b/cmd/ioworkload/scenario_socket.go
index 9885cbb..db95ad4 100644
--- a/cmd/ioworkload/scenario_socket.go
+++ b/cmd/ioworkload/scenario_socket.go
@@ -75,3 +75,48 @@ func socketAcceptLifecycle() error {
}
return nil
}
+
+func socketAcceptLifecyclePlain() error {
+ dir, err := os.MkdirTemp("", "ioworkload-socket-accept-plain-")
+ if err != nil {
+ return fmt.Errorf("create temp dir: %w", err)
+ }
+ defer os.RemoveAll(dir)
+
+ socketPath := filepath.Join(dir, "accept.sock")
+
+ listenerFD, err := syscall.Socket(syscall.AF_UNIX, syscall.SOCK_STREAM, 0)
+ if err != nil {
+ return fmt.Errorf("listener socket: %w", err)
+ }
+ defer syscall.Close(listenerFD) //nolint:errcheck
+
+ if err := syscall.Bind(listenerFD, &syscall.SockaddrUnix{Name: socketPath}); err != nil {
+ return fmt.Errorf("bind: %w", err)
+ }
+ if err := syscall.Listen(listenerFD, 1); err != nil {
+ return fmt.Errorf("listen: %w", err)
+ }
+
+ clientFD, err := syscall.Socket(syscall.AF_UNIX, syscall.SOCK_STREAM, 0)
+ if err != nil {
+ return fmt.Errorf("client socket: %w", err)
+ }
+ defer syscall.Close(clientFD) //nolint:errcheck
+
+ if err := syscall.Connect(clientFD, &syscall.SockaddrUnix{Name: socketPath}); err != nil {
+ return fmt.Errorf("connect: %w", err)
+ }
+
+ acceptedFDRaw, _, errno := syscall.Syscall(syscall.SYS_ACCEPT, uintptr(listenerFD), 0, 0)
+ if errno != 0 {
+ return fmt.Errorf("accept: %w", errno)
+ }
+ acceptedFD := int(acceptedFDRaw)
+ defer syscall.Close(acceptedFD) //nolint:errcheck
+
+ if err := syscall.Shutdown(acceptedFD, syscall.SHUT_RDWR); err != nil {
+ return fmt.Errorf("shutdown accepted fd: %w", err)
+ }
+ return nil
+}
diff --git a/cmd/ioworkload/scenarios.go b/cmd/ioworkload/scenarios.go
index db5b549..5648801 100644
--- a/cmd/ioworkload/scenarios.go
+++ b/cmd/ioworkload/scenarios.go
@@ -7,104 +7,105 @@ 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-duration-gap": openDurationGap,
- "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,
- "retbytes-phase-a": retbytesPhaseA,
- "socket-basic": socketBasic,
- "socketpair-basic": socketpairBasic,
- "socket-accept-lifecycle": socketAcceptLifecycle,
- "family-mixed": familyMixed,
- "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-getcwd": dirGetcwd,
- "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,
- "mmap-basic": mmapBasic,
- "mmap-msync-sync": mmapMsyncSync,
- "mmap-msync-invalid-flags": mmapMsyncInvalidFlags,
- "copy-file-range-basic": copyFileRangeBasic,
- "copy-file-range-bad-dst-fd": copyFileRangeBadDstFd,
- "truncate-basic": truncateBasic,
- "truncate-ftruncate": truncateFtruncate,
- "truncate-enoent": truncateEnoent,
- "truncate-ftruncate-ebadf": truncateFtruncateEbadf,
- "pidfd-getfd-success": pidfdGetfdSuccess,
- "pidfd-getfd-failure": pidfdGetfdFailure,
- "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-duration-gap": openDurationGap,
+ "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,
+ "retbytes-phase-a": retbytesPhaseA,
+ "socket-basic": socketBasic,
+ "socketpair-basic": socketpairBasic,
+ "socket-accept-lifecycle": socketAcceptLifecycle,
+ "socket-accept-lifecycle-plain": socketAcceptLifecyclePlain,
+ "family-mixed": familyMixed,
+ "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-getcwd": dirGetcwd,
+ "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,
+ "mmap-basic": mmapBasic,
+ "mmap-msync-sync": mmapMsyncSync,
+ "mmap-msync-invalid-flags": mmapMsyncInvalidFlags,
+ "copy-file-range-basic": copyFileRangeBasic,
+ "copy-file-range-bad-dst-fd": copyFileRangeBadDstFd,
+ "truncate-basic": truncateBasic,
+ "truncate-ftruncate": truncateFtruncate,
+ "truncate-enoent": truncateEnoent,
+ "truncate-ftruncate-ebadf": truncateFtruncateEbadf,
+ "pidfd-getfd-success": pidfdGetfdSuccess,
+ "pidfd-getfd-failure": pidfdGetfdFailure,
+ "iouring-setup": iouringSetup,
+ "iouring-enter": iouringEnter,
+ "iouring-register": iouringRegister,
+ "iouring-enter-ebadf": iouringEnterEbadf,
+ "iouring-register-ebadf": iouringRegisterEbadf,
}
func makeTempDir(prefix string) (string, func(), error) {