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);