per https://github.com/ziglang/zig/issues/9162,
There seems to be a limit somewhere that causes open() to return ENOMEM
when 1000+ files are opened with O_EXLOCK, this is independent of any
"open file" limits.
I eyeballed the vfs syscalls code but couldn't figure out where
ENOMEM is coming from. The problem seems filesystem independent - I
tried with tmpfs and ZFS and got the same result with both.
Here's a simple reproducer:
#include <sys/param.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
int main(int argc, char **argv ){
char path[32];
for (int i = 0; i < 2000; ++i) {
snprintf(path, sizeof(path), "/tmp/XXX%d", i);
int n = open(path, O_CREAT | O_EXLOCK);
if (n == -1) {
printf("bleh %d: %s\n", i, strerror(errno));
return 1;
}
}
return 0;
}
$ ./a.out
bleh 1010: Cannot allocate memory
While it's arguable that what Zig is doing here isn't sensible,
it would be nice to know where the limit is coming from and whether
it's adjustable.