Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ADR-013: POSIX Semantics Scope

Status: Accepted Date: 2026-04-17 Context: A-ADV-4 (POSIX semantics depth)

Decision

POSIX support via FUSE with explicit compatibility matrix.

Supported (full semantics)

OperationNotes
open, close, read, writeStandard file I/O
create, unlink, mkdir, rmdirDirectory operations
rename (within namespace)Atomic within shard
stat, fstat, lstatFile metadata
chmod, chownPermission changes (stored in delta attributes)
readdir, readdirplusDirectory listing from view
symlink, readlinkStored as inline data in delta
truncate, ftruncateComposition resize
fsync, fdatasyncFlush to durable (delta committed)
extended attributes (xattr)getxattr, setxattr, listxattr, removexattr
POSIX file locks (fcntl)Per-gateway lock state
O_APPENDAtomic append via delta
O_CREAT, O_EXCLAtomic create-if-not-exists

Supported (limited semantics)

OperationLimitation
rename (cross-namespace)Returns EXDEV (ADR: I-L8)
hard linksWithin namespace only; cross-namespace returns EXDEV
sparse filesHoles tracked in composition; zero-fill on read
O_DIRECTBypasses client cache but still goes through FUSE
flock (advisory)Best-effort; not guaranteed across gateway failover

Not supported

OperationReason
mmap (shared, writable)Distributed shared writable mmap requires page-level coherence — not tractable for a distributed system at HPC scale. Read-only mmap is supported. The FUSE client returns ENOTSUP with a log message: “writable shared mmap not supported; use write() instead.”
ACLs (POSIX.1e)Unix permissions only (uid/gid/mode). POSIX ACLs add complexity without significant benefit for the target workload. Revisit if needed.
chroot, pivot_rootFilesystem-level operations, not meaningful for FUSE mount

Consequences

  • mmap restriction documented prominently (HPC users expect it)
  • Read-only mmap works (useful for model loading)
  • Writable mmap requires application changes (use write() instead)
  • No POSIX ACLs simplifies the permission model