Try to fix pg_upgrade test on Windows, again.

Further to commit 54e72b66e, if rmtree() fails while cleaning up in
pg_upgrade, try again.  This gives our Windows unlink() wrapper a chance
to reach its wait-for-the-other-process-to-go-away logic, if the first
go around initiated the unlink of a file that a concurrently exiting
program still has open.

Discussion: https://postgr.es/m/CA%2BhUKGKCVy2%3Do%3Dd8c2Va6a_3Rpf_KkhUitkWCZ3hzuO2VwLMXA%40mail.gmail.com
This commit is contained in:
Thomas Munro 2023-02-01 14:29:51 +13:00
parent 758f44bc3a
commit c289117505
1 changed files with 13 additions and 2 deletions

View File

@ -68,7 +68,12 @@ cleanup_output_dirs(void)
if (log_opts.retain) if (log_opts.retain)
return; return;
(void) rmtree(log_opts.basedir, true); /*
* Try twice. The second time might wait for files to finish being
* unlinked, on Windows.
*/
if (!rmtree(log_opts.basedir, true))
rmtree(log_opts.basedir, true);
/* Remove pg_upgrade_output.d only if empty */ /* Remove pg_upgrade_output.d only if empty */
switch (pg_check_dir(log_opts.rootdir)) switch (pg_check_dir(log_opts.rootdir))
@ -80,7 +85,13 @@ cleanup_output_dirs(void)
case 1: /* exists and empty */ case 1: /* exists and empty */
case 2: /* exists and contains only dot files */ case 2: /* exists and contains only dot files */
(void) rmtree(log_opts.rootdir, true);
/*
* Try twice. The second time might wait for files to finish
* being unlinked, on Windows.
*/
if (!rmtree(log_opts.rootdir, true))
rmtree(log_opts.rootdir, true);
break; break;
case 4: /* exists */ case 4: /* exists */