[ Crash ] EOPNOTSUPP hh_client on linux kernel version 6.9 and below in Docker (using overlayfs)
Describe the bug When running hh_client with a modern hhvm build on the 6.1 kernel (the default of Debian 12), an error is raised EOPNOTSUPP. This error is not raised on a 6.12 kernel.
Standalone code, or other way to reproduce the problem
Steps to reproduce the behavior:
- Compile your own hhvm and hh_client from this PR: https://github.com/facebook/hhvm/pull/9564
- Create an empty
/etc/hh.conffile - Create an new directory with
.hhconfigandfile.hack. Both can be empty. - Typecheck your code with
hh_server --check . - Typecheck your code with
hh_server .orhh_client - This last step fails with the error described above.
Expected behavior
No errors!
Actual behavior
("Unix.Unix_error(Unix.EOPNOTSUPP, \"hh_open_tmpfile\", \"/tmp/hh_server\")")
Raised by primitive operation at Sys_utils.atomically_create_and_init_file in file "hack/src/utils/sys/sys_utils.ml", line 772, characters 11-71
Called from Server_progress.ErrorsWrite.new_empty_file.(fun) in file "hack/src/client_and_server/server_progress.ml", lines 446-453, characters 14-53
Environment
- Operating system
'Debian 12 (Bookworm)'
- Installation method
'built from source' 'running in docker'
- HHVM Version
HipHop VM 6.79.0-dev (rel) (non-lowptr) Compiler: heads/fix-oss-build-0-g03747d03a401005326a90060621b41bf88ef999c Repo schema: 4e0f8e27bd2ef969b1c0606be3fec128f116cac8 hackc-ea9ee869cba86727ff515f59ac651db9dd90a203-6.79.0-dev
~~A naïve search indicates the error is related to an unsupported socket operation, so straceing your hh_client process might yield some more useful context on the exact operation / syscall that's failing here.~~
Edit: probably it's O_TMPFILE from b784cacd3b72d9c346c206ef6f7b02f5fa34acfe by elimination. What filesystem were you using?
Edit: probably it's
O_TMPFILEfrom b784cac by elimination. What filesystem were you using?
I didn't change the default, so ext4.
I marked this issue as won't fix, because this looks like a missing (implicit) system requirement. Have I misjudged that?
Yeah, from some more digging this seems to be because overlayfs (used by Docker and co for container filesystems) didn't support O_TMPFILE until https://github.com/torvalds/linux/commit/9a87907de3597a339cc129229d1a20bc7365ea5f / 6.10.x.
In theory the code could have a fallback for this but I don't think it'd be worth doing, since support exists now and (AIUI) bind-mounting some local directory instead of using an in-container directory should be a usable workaround on older systems. Certainly good to have this noted in an issue though in case someone runs into it.
On Debian, you can install a newer kernel from backports. Currently, kernel 6.12.32 is available in bookwork-backports. It should also work fine if you run it directly on the system rather than using Docker.
@lexidor It would be useful to change the title of this issue to say it's an issue with Docker/overlayfs specifically.
@lexidor It would be useful to change the title of this issue to say it's an issue with Docker/overlayfs specifically.
I have changed the issue title.