summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Munro2023-02-01 01:29:51 +0000
committerThomas Munro2023-02-01 01:40:25 +0000
commitc2891175052772b603da6d0ae634e42b63b7f274 (patch)
tree354103b1e492c139ad4ea7f37310578d4f21d5bf
parent758f44bc3a365bed6b82db098bebc26ef441ba42 (diff)
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
-rw-r--r--src/bin/pg_upgrade/util.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/src/bin/pg_upgrade/util.c b/src/bin/pg_upgrade/util.c
index 42dcbfc5b5..21ba4c8f12 100644
--- a/src/bin/pg_upgrade/util.c
+++ b/src/bin/pg_upgrade/util.c
@@ -68,7 +68,12 @@ cleanup_output_dirs(void)
if (log_opts.retain)
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 */
switch (pg_check_dir(log_opts.rootdir))
@@ -80,7 +85,13 @@ cleanup_output_dirs(void)
case 1: /* exists and empty */
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;
case 4: /* exists */