X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=blobdiff_plain;f=lib%2FPublicInbox%2FSpawn.pm;h=137b80878a35bced4a0735542908190d3dce1d92;hp=e0a51c2167e829549d20683470aa55b02c3556b5;hb=14fa0abdcc7b6513540e529375e53edd74ce13e8;hpb=6beeb75e5ccddf9f4e8eefc62cbe349972f59917 diff --git a/lib/PublicInbox/Spawn.pm b/lib/PublicInbox/Spawn.pm index e0a51c21..137b8087 100644 --- a/lib/PublicInbox/Spawn.pm +++ b/lib/PublicInbox/Spawn.pm @@ -1,4 +1,4 @@ -# Copyright (C) 2016-2021 all contributors +# Copyright (C) all contributors # License: AGPL-3.0+ # # This allows vfork to be used for spawning subprocesses if @@ -21,7 +21,7 @@ use Symbol qw(gensym); use Fcntl qw(LOCK_EX SEEK_SET); use IO::Handle (); use PublicInbox::ProcessPipe; -our @EXPORT_OK = qw(which spawn popen_rd run_die nodatacow_dir); +our @EXPORT_OK = qw(which spawn popen_rd run_die); our @RLIMITS = qw(RLIMIT_CPU RLIMIT_CORE RLIMIT_DATA); BEGIN { @@ -268,62 +268,12 @@ void recv_cmd4(PerlIO *s, SV *buf, STRLEN n) #endif /* defined(CMSG_SPACE) && defined(CMSG_LEN) */ ALL_LIBC -# btrfs on Linux is copy-on-write (COW) by default. As of Linux 5.7, -# this still leads to fragmentation for SQLite and Xapian files where -# random I/O happens, so we disable COW just for SQLite files and Xapian -# directories. Disabling COW disables checksumming, so we only do this -# for regeneratable files, and not canonical git storage (git doesn't -# checksum refs, only data under $GIT_DIR/objects). - my $set_nodatacow = $^O eq 'linux' ? <<'SET_NODATACOW' : ''; -#include -#include -#include -#include -#include - -void nodatacow_fd(int fd) -{ - struct statfs buf; - int val = 0; - - if (fstatfs(fd, &buf) < 0) { - fprintf(stderr, "fstatfs: %s\\n", strerror(errno)); - return; - } - - /* only btrfs is known to have this problem, so skip for non-btrfs */ - if (buf.f_type != BTRFS_SUPER_MAGIC) - return; - - if (ioctl(fd, FS_IOC_GETFLAGS, &val) < 0) { - fprintf(stderr, "FS_IOC_GET_FLAGS: %s\\n", strerror(errno)); - return; - } - val |= FS_NOCOW_FL; - if (ioctl(fd, FS_IOC_SETFLAGS, &val) < 0) - fprintf(stderr, "FS_IOC_SET_FLAGS: %s\\n", strerror(errno)); -} - -void nodatacow_dir(const char *dir) -{ - DIR *dh = opendir(dir); - int fd; - - if (!dh) croak("opendir(%s): %s", dir, strerror(errno)); - fd = dirfd(dh); - if (fd >= 0) - nodatacow_fd(fd); - /* ENOTSUP probably won't happen under Linux... */ - closedir(dh); -} -SET_NODATACOW - my $inline_dir = $ENV{PERL_INLINE_DIRECTORY} //= ( $ENV{XDG_CACHE_HOME} // ( ($ENV{HOME} // '/nonexistent').'/.cache' ) ).'/public-inbox/inline-c'; warn "$inline_dir exists, not writable\n" if -e $inline_dir && !-w _; - $set_nodatacow = $all_libc = undef unless -d _ && -w _; + $all_libc = undef unless -d _ && -w _; if (defined $all_libc) { my $f = "$inline_dir/.public-inbox.lock"; open my $oldout, '>&', \*STDOUT or die "dup(1): $!"; @@ -337,17 +287,10 @@ SET_NODATACOW # CentOS 7.x ships Inline 0.53, 0.64+ has built-in locking flock($fh, LOCK_EX) or die "LOCK_EX($f): $!"; eval <<'EOM'; -use Inline C => $all_libc.$set_nodatacow, BUILD_NOISY => 1; +use Inline C => $all_libc, BUILD_NOISY => 1; EOM my $err = $@; my $ndc_err = ''; - if ($err && $set_nodatacow) { # missing Linux kernel headers - $ndc_err = "with set_nodatacow: <\n$err\n>\n"; - undef $set_nodatacow; - eval <<'EOM'; -use Inline C => $all_libc, BUILD_NOISY => 1; -EOM - }; $err = $@; open(STDERR, '>&', $olderr) or warn "restore stderr: $!"; open(STDOUT, '>&', $oldout) or warn "restore stdout: $!"; @@ -356,22 +299,13 @@ EOM my @msg = <$fh>; warn "Inline::C build failed:\n", $ndc_err, $err, "\n", @msg; - $set_nodatacow = $all_libc = undef; - } elsif ($ndc_err) { - warn "Inline::C build succeeded w/o set_nodatacow\n", - "error $ndc_err"; + $all_libc = undef; } } unless ($all_libc) { require PublicInbox::SpawnPP; *pi_fork_exec = \&PublicInbox::SpawnPP::pi_fork_exec } - unless ($set_nodatacow) { - require PublicInbox::NDC_PP; - no warnings 'once'; - *nodatacow_fd = \&PublicInbox::NDC_PP::nodatacow_fd; - *nodatacow_dir = \&PublicInbox::NDC_PP::nodatacow_dir; - } } # /BEGIN sub which ($) {