summaryrefslogtreecommitdiff
path: root/integrationtests/cmd
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-02-21 19:35:12 +0200
committerPaul Buetow <paul@buetow.org>2026-02-21 19:35:12 +0200
commitfa4de83302f992a94941ef904f05ce2752f6ec29 (patch)
tree4f3fa2be7a05cc9c1680c31feb9ee45ebb389f3f /integrationtests/cmd
parenta5b711c5f221704209706b79fbf310a18e079391 (diff)
Implement sync_test.go + workload scenarios for fsync, fdatasync, sync, sync_file_range
- Add syncFdatasync, syncSync, syncSyncFileRange scenario functions - Register sync-fdatasync, sync-sync, sync-sync-file-range in scenarios map - Add sync_test.go with tests for all 4 sync-related syscalls - sync is a null_event (no path); others are fd_events - All use direct SYS_* syscalls on amd64 (no wrapper delegation) Task: #343 Amp-Thread-ID: https://ampcode.com/threads/T-019c813f-e020-7558-86ce-be6fdbd96f98 Co-authored-by: Amp <amp@ampcode.com>
Diffstat (limited to 'integrationtests/cmd')
-rw-r--r--integrationtests/cmd/ioworkload/scenarios.go57
1 files changed, 55 insertions, 2 deletions
diff --git a/integrationtests/cmd/ioworkload/scenarios.go b/integrationtests/cmd/ioworkload/scenarios.go
index bf1561c..e87d53e 100644
--- a/integrationtests/cmd/ioworkload/scenarios.go
+++ b/integrationtests/cmd/ioworkload/scenarios.go
@@ -48,8 +48,11 @@ var scenarios = map[string]func() error{
"stat-statx": statStatx,
"stat-access": statAccess,
"stat-faccessat": statFaccessat,
- "sync-basic": syncBasic,
- "truncate-basic": truncateBasic,
+ "sync-basic": syncBasic,
+ "sync-fdatasync": syncFdatasync,
+ "sync-sync": syncSync,
+ "sync-sync-file-range": syncSyncFileRange,
+ "truncate-basic": truncateBasic,
}
func makeTempDir(prefix string) (string, func(), error) {
@@ -1285,6 +1288,56 @@ func syncBasic() error {
return syscall.Fsync(fd)
}
+// syncFdatasync opens a file, writes data, and fdatasyncs it.
+func syncFdatasync() error {
+ dir, cleanup, err := makeTempDir("sync-fdatasync")
+ if err != nil {
+ return err
+ }
+ defer cleanup()
+
+ path := filepath.Join(dir, "fdatasyncfile.txt")
+ fd, err := syscall.Open(path, syscall.O_RDWR|syscall.O_CREAT, 0o644)
+ if err != nil {
+ return fmt.Errorf("open: %w", err)
+ }
+ defer syscall.Close(fd)
+
+ if _, err := syscall.Write(fd, []byte("fdatasync me")); err != nil {
+ return fmt.Errorf("write: %w", err)
+ }
+ return syscall.Fdatasync(fd)
+}
+
+// syncSync calls sync(2) to flush all filesystem caches.
+// sync is a null_event with no file arguments.
+func syncSync() error {
+ syscall.Sync()
+ return nil
+}
+
+// syncSyncFileRange opens a file, writes data, then calls sync_file_range(2).
+func syncSyncFileRange() error {
+ dir, cleanup, err := makeTempDir("sync-sync-file-range")
+ if err != nil {
+ return err
+ }
+ defer cleanup()
+
+ path := filepath.Join(dir, "syncrangefile.txt")
+ fd, err := syscall.Open(path, syscall.O_RDWR|syscall.O_CREAT, 0o644)
+ if err != nil {
+ return fmt.Errorf("open: %w", err)
+ }
+ defer syscall.Close(fd)
+
+ data := []byte("sync file range data")
+ if _, err := syscall.Write(fd, data); err != nil {
+ return fmt.Errorf("write: %w", err)
+ }
+ return syscall.SyncFileRange(fd, 0, int64(len(data)), 0)
+}
+
// truncateBasic opens a file, writes data, and truncates it.
func truncateBasic() error {
dir, cleanup, err := makeTempDir("truncate-basic")