about summary refs log tree commit homepage
path: root/lib/PublicInbox/Spawn.pm
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2022-01-30 21:49:08 +0000
committerEric Wong <e@80x24.org>2022-01-31 02:04:11 +0000
commit14fa0abdcc7b6513540e529375e53edd74ce13e8 (patch)
tree9f0de95629590def3c2dd72df28243faf129014e /lib/PublicInbox/Spawn.pm
parent6beeb75e5ccddf9f4e8eefc62cbe349972f59917 (diff)
downloadpublic-inbox-14fa0abdcc7b6513540e529375e53edd74ce13e8.tar.gz
btrfs is Linux-only at the moment (and likely to remain that way
for practical purposes).  So rely on Linux ABI stability and use
the `syscall' and `ioctl' perlops rather than relying on Inline::C.
Inline::C (and gcc||clang) are monstrous dependencies which we
can't expect users to have.

This makes supporting new architectures more difficult, but new
architectures come along rarely and this reduces the burden for
the majority of Linux users on popular architectures (while
still avoiding the distribution of pre-built binaries).

Link: https://public-inbox.org/meta/YbCPWGaJEkV6eWfo@codewreck.org/
Diffstat (limited to 'lib/PublicInbox/Spawn.pm')
-rw-r--r--lib/PublicInbox/Spawn.pm76
1 files changed, 5 insertions, 71 deletions
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 <meta@public-inbox.org>
+# Copyright (C) all contributors <meta@public-inbox.org>
 # License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
 #
 # 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 <sys/ioctl.h>
-#include <sys/vfs.h>
-#include <linux/magic.h>
-#include <linux/fs.h>
-#include <dirent.h>
-
-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 ($) {