Hi,
some of our customers run applications that require the lookupcache=pos
mount option. One example of such an application is Gitlab [1]. Recently we
profiled a Gitlab workload and noticed that 38% of compound operations and
27% of EFS server time were spent on an ACCESS compound (SEQUENCE, PUTFH,
ACCESS, GETATTR) that we weren't sure is necessary.
To reproduce:
1. Mount an NFS file system with -o lookupcache=pos.
2. $ mkdir /mnt/a
3. $ for i in `seq 1 10`; do ls /mnt/a/nonex.txt; done
There are two compounds that are emitted for every iteration in step 3:
1. SEQUENCE, PUTFH, ACCESS, GETATTR
2. SEQUENCE, PUTFH, LOOKUP, GETFH, GETATTR
In the first compound, ACCESS has FH=</mnt/a> and access=0x1f. The result is
NFS4_OK with supported=0x1f and access=1f. In the second compound, LOOKUP
has FH=</mnt/a> and objname="nonex.txt". The result is NFS4ERR_NOENT.
If I understand lookupcache=pos correctly, it causes the result of LOOKUP
not to be cached because of the ENOENT, which is what's happening. Is there
a reason that the succesful ACCESS is not cached in the parent directory's
access_cache? Caching it would reduce the runtime of this application by
about 27% which would be a nice speedup.
[1] https://docs.gitlab.com/ee/administration/nfs.html