]> granicus.if.org Git - postgresql/commitdiff
Allow ENOENT in check_mode_recursive().
authorNoah Misch <noah@leadboat.com>
Sun, 9 Sep 2018 01:26:10 +0000 (18:26 -0700)
committerNoah Misch <noah@leadboat.com>
Sun, 9 Sep 2018 01:26:10 +0000 (18:26 -0700)
Buildfarm member tern failed src/bin/pg_ctl/t/001_start_stop.pl when a
check_mode_recursive() call overlapped a server's startup-time deletion
of pg_stat/global.stat.  Just warn.  Also, include errno in the message.
Back-patch to v11, where check_mode_recursive() first appeared.

src/test/perl/TestLib.pm

index 3a184a4fadde3d18f14064aa090df5858062320b..b9cb51b9d39c27bf5db0cd89c36ca08f7a6e3909 100644 (file)
@@ -261,8 +261,6 @@ sub check_mode_recursive
                {
                        follow_fast => 1,
                        wanted      => sub {
-                               my $file_stat = stat($File::Find::name);
-
                                # Is file in the ignore list?
                                foreach my $ignore ($ignore_list ? @{$ignore_list} : [])
                                {
@@ -272,8 +270,23 @@ sub check_mode_recursive
                                        }
                                }
 
-                               defined($file_stat)
-                                 or die("unable to stat $File::Find::name");
+                               # Allow ENOENT.  A running server can delete files, such as
+                               # those in pg_stat.  Other stat() failures are fatal.
+                               my $file_stat = stat($File::Find::name);
+                               unless (defined($file_stat))
+                               {
+                                       my $is_ENOENT = $!{ENOENT};
+                                       my $msg = "unable to stat $File::Find::name: $!";
+                                       if ($is_ENOENT)
+                                       {
+                                               warn $msg;
+                                               return;
+                                       }
+                                       else
+                                       {
+                                               die $msg;
+                                       }
+                               }
 
                                my $file_mode = S_IMODE($file_stat->mode);