diff options
Diffstat (limited to 'cmd/ioworkload')
| -rw-r--r-- | cmd/ioworkload/scenario_socket.go | 45 | ||||
| -rw-r--r-- | cmd/ioworkload/scenarios.go | 197 |
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) { |
