On Wed, Feb 16, 2022 at 12:11 PM Nathan Bossart <nathandboss...@gmail.com> wrote: > On Tue, Feb 15, 2022 at 10:37:58AM -0800, Nathan Bossart wrote: > > On Tue, Feb 15, 2022 at 10:10:34AM -0800, Andres Freund wrote: > >> I generally think it'd be a good exercise to go through an use > >> get_dirent_type() in nearly all ReadDir() style loops - it's a nice > >> efficiency > >> win in general, and IIRC a particularly big one on windows. > >> > >> It'd probably be good to add a reference to get_dirent_type() to > >> ReadDir[Extended]()'s docs. > > > > Agreed. I might give this a try. > > Alright, here is a new patch set where I've tried to replace as many > stat()/lstat() calls as possible with get_dirent_type(). 0002 and 0003 are > the same as v9. I noticed a few remaining stat()/lstat() calls that don't > appear to be doing proper error checking, but I haven't had a chance to try > fixing those yet.
0001: These get_dirent_type() conversions are nice. LGTM. 0002: /* we're only handling directories here, skip if it's not ours */ - if (lstat(path, &statbuf) == 0 && !S_ISDIR(statbuf.st_mode)) + if (lstat(path, &statbuf) != 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not stat file \"%s\": %m", path))); + else if (!S_ISDIR(statbuf.st_mode)) return; Why is this a good place to silently ignore non-directories? StartupReorderBuffer() is already in charge of skipping random detritus found in the directory, so would it be better to do "if (get_dirent_type(...) != PGFILETYPE_DIR) continue" there, and then drop the lstat() stanza from ReorderBufferCleanupSeralizedTXNs() completely? Then perhaps its ReadDirExtended() shoud be using ERROR instead of INFO, so that missing/non-dir/b0rked directories raise an error. I don't understand why it's reporting readdir() errors at INFO but unlink() errors at ERROR, and as far as I can see the other paths that reach this code shouldn't be sending in paths to non-directories here unless something is seriously busted and that's ERROR-worthy. 0003: I haven't studied this cure vs disease thing... no opinion today.