feat: add best-effort O_DIRECT support for posix put/get-object put-part

This change introduces an opt-in O_DIRECT mode for POSIX object data paths while
keeping behavior safe and predictable across different filesystems and kernel
constraints. We now use direct I/O when available and beneficial, but preserve
correctness by falling back to buffered I/O when runtime read behavior indicates
alignment or capability mismatches.

The implementation keeps fast paths available for full-object reads and
descriptor-to-descriptor copy operations so kernel-level optimizations can still
be used where possible. At the same time, it avoids global assumptions from
single runtime failures and performs fallback at the stream level so requests
can continue successfully without broad feature disablement.
This commit is contained in:
Ben McClelland
2026-07-31 13:29:48 -07:00
parent 029a002777
commit 062bf0bf47
14 changed files with 651 additions and 62 deletions
+17
View File
@@ -33,7 +33,9 @@ var (
nometa bool
forceNoTmpFile bool
forceNoCopyFileRange bool
enableODirect bool
actionsConcurrency int
ioBufferSize int
defaultEtag string
)
@@ -98,6 +100,13 @@ will be translated into the file /mnt/fs/gwroot/mybucket/a/b/c/myobject`,
Value: 5000,
Destination: &actionsConcurrency,
},
&cli.IntFlag{
Name: "io-buffer-size",
Usage: "buffer size in bytes used by POSIX put/get/part read and write paths (<=0 uses backend default 1MiB)",
EnvVars: []string{"VGW_POSIX_IO_BUFFER_SIZE"},
Value: 1024 * 1024,
Destination: &ioBufferSize,
},
&cli.BoolFlag{
Name: "nometa",
Usage: "disable metadata storage",
@@ -116,6 +125,12 @@ will be translated into the file /mnt/fs/gwroot/mybucket/a/b/c/myobject`,
EnvVars: []string{"VGW_DISABLE_COPY_FILE_RANGE"},
Destination: &forceNoCopyFileRange,
},
&cli.BoolFlag{
Name: "enable-odirect",
Usage: "enable best-effort O_DIRECT for object data reads/writes",
EnvVars: []string{"VGW_ENABLE_O_DIRECT"},
Destination: &enableODirect,
},
&cli.StringFlag{
Name: "default-etag",
Usage: "default ETag value returned for objects that do not have a stored etag attribute (e.g. files placed on the filesystem outside of versitygw)",
@@ -153,8 +168,10 @@ func runPosix(ctx *cli.Context) error {
NewDirPerm: fs.FileMode(dirPerms),
ForceNoTmpFile: forceNoTmpFile,
ForceNoCopyFileRange: forceNoCopyFileRange,
EnableODirect: enableODirect,
ValidateBucketNames: disableStrictBucketNames,
Concurrency: actionsConcurrency,
IOBufferSize: ioBufferSize,
CopyObjectThreshold: copyObjectThreshold,
DefaultEtag: defaultEtag,
}