summaryrefslogtreecommitdiff
path: root/integrationtests
diff options
context:
space:
mode:
Diffstat (limited to 'integrationtests')
-rw-r--r--integrationtests/aio_test.go42
1 files changed, 42 insertions, 0 deletions
diff --git a/integrationtests/aio_test.go b/integrationtests/aio_test.go
index b38e20b..9fba4b1 100644
--- a/integrationtests/aio_test.go
+++ b/integrationtests/aio_test.go
@@ -51,3 +51,45 @@ func TestAioSubmit(t *testing.T) {
},
}, aioSubmitTraceArgs)
}
+
+// aioGeteventsTraceArgs additionally traces io_getevents so the getevents
+// scenario can assert on its enter tracepoint. io_getevents is KindNull
+// (FamilyAIO): the enter event captures no fd/path (ctx_id is an AIO context
+// handle, events/timeout are opaque userspace pointers) and the exit event
+// carries the raw return value (a count of events reaped, UNCLASSIFIED).
+var aioGeteventsTraceArgs = []string{"-trace-syscalls", "io_setup,io_submit,io_getevents,io_destroy,close"}
+
+// TestAioGetevents exercises io_getevents(2) end-to-end: the workload sets up an
+// AIO context, submits one real iocb (a positional write), then reaps its
+// completion with io_getevents. ior must record the enter_io_getevents
+// tracepoint for the AIO family workload.
+func TestAioGetevents(t *testing.T) {
+ runScenarioResultWithIorArgs(t, "aio-getevents", []ExpectedEvent{
+ {
+ Tracepoint: "enter_io_getevents",
+ Comm: "ioworkload",
+ MinCount: 1,
+ },
+ }, aioGeteventsTraceArgs)
+}
+
+// aioCancelTraceArgs additionally traces io_cancel and io_getevents so the
+// cancel scenario can assert on its enter tracepoint and still drain the
+// completion ring. io_cancel is KindNull (FamilyAIO): the enter event captures
+// no fd/path (ctx_id is an AIO context handle, iocb/result are opaque userspace
+// pointers) and the exit event carries the raw return value (UNCLASSIFIED).
+var aioCancelTraceArgs = []string{"-trace-syscalls", "io_setup,io_submit,io_cancel,io_getevents,io_destroy,close"}
+
+// TestAioCancel exercises io_cancel(2): the workload submits one real iocb and
+// then attempts to cancel it. io_cancel races the I/O completion and frequently
+// returns -EINVAL/-EAGAIN, so the test asserts ONLY on the enter_io_cancel
+// tracepoint (which fires regardless of the return value), never on success.
+func TestAioCancel(t *testing.T) {
+ runScenarioResultWithIorArgs(t, "aio-cancel", []ExpectedEvent{
+ {
+ Tracepoint: "enter_io_cancel",
+ Comm: "ioworkload",
+ MinCount: 1,
+ },
+ }, aioCancelTraceArgs)
+}