At Sun, 18 Jul 2021 12:32:20 +0900, Michael Paquier <mich...@paquier.xyz> wrote in > Hi all, > > prairiedog has failed in a way that seems a bit obscure to me: > https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=prairiedog&dt=2021-07-18%2000%3A23%3A29 > > Here are the details of the failure: > server signaled to rotate log file > could not read > "/Users/buildfarm/bf-data/HEAD/pgsql.build/src/bin/pg_ctl/tmp_check/t_004_logrotate_primary_data/pgdata/current_logfiles": > No such file or directory at t/004_logrotate.pl line 78 > ### Stopping node "primary" using mode immediate > > update_metainfo_datafile() creates a temporary file renamed to > current_logfiles with rename(). It should be atomic, though this > error points out that this is not the case? The previous steps of > this test ensure that current_logfiles should exist. > > We could use some eval blocks in this area, but a non-atomic rename() > would cause problems in more areas. Thoughts?
PostgresNode.logrotate() just invokes pg_ctl logrotate, which ends with triggering log rotation by a signal. When rotation happens, the metainfo file is once removed then created. If slurp_file in the metafile-checking loop hits the gap, the slurp_file fails with ENOENT. For non-win32 platforms, the error is identifiable by #!{ENOENT} but I'm not sure how we can identify the error for createFile(). $! doesn't work, and $^E returns a human-readable string in the platform language.. regards. -- Kyotaro Horiguchi NTT Open Source Software Center