Re: pg11+: pg_ls_*dir LIMIT 1: temporary files .. not closed at end-of-transaction
Justin Pryzby <pryzby@telsasoft.com>
From: Justin Pryzby <pryzby@telsasoft.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: pgsql-hackers@postgresql.org, Fabien COELHO <coelho@cri.ensmp.fr>, Alvaro Herrera <alvherre@2ndquadrant.com>, David Steele <david@pgmasters.net>, "Bossart, Nathan" <bossartn@amazon.com>, Thomas Munro <thomas.munro@gmail.com>
Date: 2020-03-29T20:12:15Z
Lists: pgsql-hackers
On Sun, Mar 29, 2020 at 01:22:04PM -0400, Tom Lane wrote: > Justin Pryzby <pryzby@telsasoft.com> writes: > > On Sun, Mar 29, 2020 at 12:37:05PM -0400, Tom Lane wrote: > >> After looking at the callers of pg_ls_dir_files, and noticing that > >> it's already defined to ignore anything that's not a regular file, > >> I think switching to lstat makes sense. > > > Yea, only pg_ls_dir() shows special file types (and currently the others even > > hide dirs). > > > The essence of your patch is to ignore ENOENT, but you also changed to use > > lstat(), which seems unrelated. That means we'll now hide (non-broken) > > symlinks. Is that intentional/needed ? > > Well, the following comment says "ignore anything but regular files", > so I'm supposing that that is the behavior that we actually want here > and failed to implement correctly. There might be scope for > additional directory-reading functions, but I'd think you'd want > more information (such as the file type) returned from anything > that doesn't act this way. Maybe pg_stat_file() deserves similar attention ? Right now, it'll fail on a broken link. If we changed it to lstat(), then it'd work, but it'd also show metadata for the *link* rather than its target. Patch proposed as v14-0001 patch here may be relevant: https://www.postgresql.org/message-id/20200317190401.GY26184%40telsasoft.com - indicating if it is a directory. Typical usages include: + indicating if it is a directory (or a symbolic link to a directory). ... > In practice, since these directories shouldn't contain symlinks, > it's likely moot. The only place in PG data directories where > we actually expect symlinks is pg_tablespace ... and that contains > symlinks to directories, so that this function would ignore them > anyway. I wouldn't hesitate to make symlinks, at least in log. It's surprising when files are hidden, but I won't argue about the best behavior here. I'm thinking of distributions or local configurations that use /var/log/postgresql. I didn't remember or didn't realize, but it looks like debian's packages use logging_collector=off and then launch postmaster with 2> /var/log/postgres/... It seems reasonable to do something like: log/huge-querylog.csv => /zfs/compressed/... -- Justin
Commits
-
Teach pg_ls_dir_files() to ignore ENOENT failures from stat().
- ee40e8975e2c 12.3 landed
- 83f7761d84e6 10.13 landed
- 82e801852274 13.0 landed
- 5b22ff764b0f 11.8 landed
-
Remove useless pfree()s at the ends of various ValuePerCall SRFs.
- 41b45576d532 13.0 landed
-
Avoid holding a directory FD open across assorted SRF calls.
- cd6a0518794d 9.6.18 landed
- 5e4a0b7194b9 10.13 landed
- 819d5525744b 11.8 landed
- 2a89455aade3 12.3 landed
- b4570d33aa04 13.0 landed
- da254148f4de 9.5.22 landed
-
Document pg_ls_*dir hiding of directories and special files
- 8b6d94cf6c83 13.0 cited
-
Avoid holding a directory FD open across pg_ls_dir_files() calls.
- 05283dd5b579 10.13 landed
- 63b51dfec18e 11.8 landed
- 3c8864fc1c54 12.3 landed
- 085b6b6679e7 13.0 landed
-
Adjust nodeFunctionscan.c to reset transient memory context between calls
- e4186762ffaa 7.3.1 cited