1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
|
package main
import (
"fmt"
"os"
)
// scenarios maps scenario names to their execution functions.
var scenarios = map[string]func() error{
"crash": crash,
"open-basic": openBasic,
"open-openat2": openOpenat2,
"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-preadv": readwritePreadv,
"readwrite-preadv2": readwritePreadv2,
"readwrite-pwrite": readwritePwrite,
"readwrite-pwritev": readwritePwritev,
"readwrite-pwritev2": readwritePwritev2,
"readwrite-readv": readwriteReadv,
"readwrite-writev": readwriteWritev,
"readwrite-wronly-read": readwriteWronlyRead,
"readwrite-rdonly-write": readwriteRdonlyWrite,
"readwrite-pread-invalid": readwritePreadInvalid,
"readwrite-pwrite-invalid": readwritePwriteInvalid,
"readwrite-readahead": readwriteReadahead,
"readwrite-readahead-ebadf": readwriteReadaheadEbadf,
"readwrite-fadvise64": readwriteFadvise64,
"readwrite-fadvise64-ebadf": readwriteFadvise64Ebadf,
"readwrite-cachestat": readwriteCachestat,
"retbytes-phase-a": retbytesPhaseA,
"socket-basic": socketBasic,
"socketpair-basic": socketpairBasic,
"socket-accept-lifecycle": socketAcceptLifecycle,
"socket-accept-lifecycle-plain": socketAcceptLifecyclePlain,
"socket-introspection": socketIntrospection,
"pipe-basic": pipeBasic,
"pipe2-basic": pipe2Basic,
"eventfd-basic": eventfdBasic,
"eventfd2-basic": eventfd2Basic,
"fd-from-air-eventfd-users": fdFromAirEventfdUsers,
"inotify-basic": inotifyBasic,
"mq-posix-basic": mqPosixBasic,
"sysv-shm-basic": sysvShmBasic,
"sysv-msg-basic": sysvMsgBasic,
"sysv-sem-basic": sysvSemBasic,
"mountfs-management": mountfsManagement,
"polling-epoll": pollingEpoll,
"sleep-syscalls": sleepSyscalls,
"posix-timer-lifecycle": posixTimerLifecycle,
"interval-timer-noop": intervalTimerNoop,
"process-exec-lifecycle": processExecLifecycle,
"family-mixed": familyMixed,
"close-basic": closeBasic,
"close-range": closeRange,
"close-range-bounded": closeRangeBounded,
"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,
"ioctl-basic": ioctlBasic,
"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-mknodat-fifo": dirMknodatFifo,
"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,
"stat-statfs": statStatfs,
"xattr-getxattrat": xattrGetxattrat,
"xattr-listxattrat": xattrListxattrat,
"xattr-removexattrat": xattrRemovexattrat,
"xattr-getxattr": xattrGetxattr,
"xattr-lgetxattr": xattrLgetxattr,
"xattr-listxattr": xattrListxattr,
"xattr-llistxattr": xattrLlistxattr,
"xattr-lsetxattr": xattrLsetxattr,
"xattr-setxattrat": xattrSetxattrat,
"xattr-removexattr": xattrRemovexattr,
"xattr-lremovexattr": xattrLremovexattr,
"xattr-fd": xattrFd,
"chmod-basic": chmodBasic,
"chown-basic": chownBasic,
"utime-basic": utimeBasic,
"utime-utimes": utimeUtimes,
"utime-futimesat": utimeFutimesat,
"utime-utimensat": utimeUtimensat,
"utime-enoent": utimeEnoent,
"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,
"mmap-mremap-munmap": mmapMremapMunmap,
"mmap-memory-lock": mmapMemoryLock,
"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,
"pidfd-send-signal": pidfdSendSignal,
"security-keys-ptrace-perf": securityKeysPtracePerf,
"security-landlock": securityLandlockCreateRuleset,
"security-getrandom": securityGetrandom,
"flock-basic": flockBasic,
"iouring-setup": iouringSetup,
"iouring-enter": iouringEnter,
"iouring-register": iouringRegister,
"iouring-enter-ebadf": iouringEnterEbadf,
"iouring-register-ebadf": iouringRegisterEbadf,
"aio-setup": aioSetup,
"aio-setup-einval": aioSetupEinval,
"aio-submit": aioSubmit,
"aio-getevents": aioGetevents,
"aio-cancel": aioCancel,
"signals-basic": signalsBasic,
"misc-basic": miscBasic,
"sched-basic": schedBasic,
"priority-basic": priorityBasic,
"ioprio-basic": ioprioBasic,
}
func makeTempDir(prefix string) (string, func(), error) {
dir, err := os.MkdirTemp("", fmt.Sprintf("ioworkload-%s-", prefix))
if err != nil {
return "", nil, fmt.Errorf("create temp dir: %w", err)
}
cleanup := func() { os.RemoveAll(dir) }
return dir, cleanup, nil
}
// crash simulates a workload that fails with a non-zero exit code.
// Used to verify the test harness handles workload failures gracefully.
func crash() error {
return fmt.Errorf("intentional crash for testing")
}
|