From: Eric Wong Date: Wed, 29 Jul 2020 11:20:00 +0000 (+0000) Subject: xapcmd: -xcpdb and -compact disable CoW, too X-Git-Tag: v1.6.0~195 X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=commitdiff_plain;h=870982d2c1a17489410ae0e4ec28170d996527b2 xapcmd: -xcpdb and -compact disable CoW, too This gives an opportunity for users already suffering from CoW fragmentation to at least get the Xapian DBs off CoW. Aside from over.sqlite3 in v1, the SQLite DBs remain untouched; though VACUUM support may come in the future. --- diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm index aa8d8ce3..080aca7c 100644 --- a/lib/PublicInbox/SearchIdx.pm +++ b/lib/PublicInbox/SearchIdx.pm @@ -21,7 +21,7 @@ use PublicInbox::OverIdx; use PublicInbox::Spawn qw(spawn); use PublicInbox::Git qw(git_unquote); use PublicInbox::MsgTime qw(msg_timestamp msg_datestamp); -our @EXPORT_OK = qw(crlf_adjust log2stack is_ancestor check_size); +our @EXPORT_OK = qw(crlf_adjust log2stack is_ancestor check_size nodatacow_dir); my $X = \%PublicInbox::Search::X; my ($DB_CREATE_OR_OPEN, $DB_OPEN); our $DB_NO_SYNC = 0; @@ -110,6 +110,12 @@ sub load_xapian_writable () { 1; } +sub nodatacow_dir ($) { + my ($dir) = @_; + opendir my $dh, $dir or die "opendir($dir): $!\n"; + PublicInbox::Spawn::set_nodatacow(fileno($dh)); +} + sub idx_acquire { my ($self) = @_; my $flag; @@ -128,8 +134,7 @@ sub idx_acquire { if (!-d $dir && (!$is_shard || ($is_shard && need_xapian($self)))) { File::Path::mkpath($dir); - opendir my $dh, $dir or die "opendir($dir): $!\n"; - PublicInbox::Spawn::set_nodatacow(fileno($dh)); + nodatacow_dir($dir); } } return unless defined $flag; diff --git a/lib/PublicInbox/Xapcmd.pm b/lib/PublicInbox/Xapcmd.pm index 3b7a581b..f1c80831 100644 --- a/lib/PublicInbox/Xapcmd.pm +++ b/lib/PublicInbox/Xapcmd.pm @@ -5,7 +5,7 @@ use strict; use warnings; use PublicInbox::Spawn qw(which popen_rd); use PublicInbox::Over; -use PublicInbox::SearchIdx; +use PublicInbox::SearchIdx qw(nodatacow_dir); use File::Temp 0.19 (); # ->newdir use File::Path qw(remove_tree); use File::Basename qw(dirname); @@ -187,6 +187,7 @@ sub prepare_run { my $v = PublicInbox::Search::SCHEMA_VERSION(); my $wip = File::Temp->newdir("xapian$v-XXXXXXXX", DIR => $dir); $tmp->{$old} = $wip; + nodatacow_dir($wip->dirname); push @queue, [ $old, $wip ]; } else { opendir my $dh, $old or die "Failed to opendir $old: $!\n"; @@ -217,6 +218,7 @@ sub prepare_run { same_fs_or_die($old, $wip->dirname); my $cur = "$old/$dn"; push @queue, [ $src // $cur , $wip ]; + nodatacow_dir($wip->dirname); $tmp->{$cur} = $wip; } # mark old shards to be unlinked @@ -406,6 +408,7 @@ sub cpdb ($$) { $ft = File::Temp->newdir("$new.compact-XXXXXX", DIR => $dir); setup_signals(); $tmp = $ft->dirname; + nodatacow_dir($tmp); } else { $tmp = $new; }