summaryrefslogtreecommitdiff
path: root/cmd/ioworkload/scenarios.go
blob: 8f2701ee2e22043300180ede58857d1fdbbd0fdf (plain)
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")
}