]> Sergey Matveev's repositories - public-inbox.git/blobdiff - lib/PublicInbox/Xapcmd.pm
xapcmd: quietly no-op on indexlevel=basic
[public-inbox.git] / lib / PublicInbox / Xapcmd.pm
index c04f935cdc1b639eb53f176c138e22060d108a4f..8d09ed2761463ce77fd7cc343a18150f014500e4 100644 (file)
@@ -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);
@@ -129,7 +129,7 @@ sub same_fs_or_die ($$) {
 
 sub process_queue {
        my ($queue, $cb, $opt) = @_;
-       my $max = $opt->{jobs} || scalar(@$queue);
+       my $max = $opt->{jobs} // scalar(@$queue);
        if ($max <= 1) {
                while (defined(my $args = shift @$queue)) {
                        $cb->($args, $opt);
@@ -167,9 +167,11 @@ sub prepare_run {
        my ($ibx, $opt) = @_;
        my $tmp = {}; # old shard dir => File::Temp->newdir object or undef
        my @queue; # ([old//src,newdir]) - list of args for cpdb() or compact()
-
-       my $old = $ibx->search->xdir(1);
-       -d $old or die "$old does not exist\n";
+       my $old;
+       if (my $srch = $ibx->search) {
+               $old = $srch->xdir(1);
+               -d $old or die "$old does not exist\n";
+       }
        my $reshard = $opt->{reshard};
        if (defined $reshard && $reshard <= 0) {
                die "--reshard must be a positive number\n";
@@ -177,7 +179,7 @@ sub prepare_run {
 
        # we want temporary directories to be as deep as possible,
        # so v2 shards can keep "xap$SCHEMA_VERSION" on a separate FS.
-       if ($ibx->version == 1) {
+       if ($old && $ibx->version == 1) {
                if (defined $reshard) {
                        warn
 "--reshard=$reshard ignored for v1 $ibx->{inboxdir}\n";
@@ -187,8 +189,9 @@ 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 {
+       } elsif ($old) {
                opendir my $dh, $old or die "Failed to opendir $old: $!\n";
                my @old_shards;
                while (defined(my $dn = readdir($dh))) {
@@ -217,6 +220,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
@@ -253,12 +257,13 @@ sub run {
        PublicInbox::Admin::progress_prepare($opt ||= {});
        defined(my $dir = $ibx->{inboxdir}) or die "no inboxdir defined\n";
        -d $dir or die "inboxdir=$dir does not exist\n";
-       check_compact() if $opt->{compact};
+       check_compact() if $opt->{compact} && $ibx->search;
        my $reindex; # v1:{ from => $x40 }, v2:{ from => [ $x40, $x40, .. ] } }
 
        if (!$opt->{-coarse_lock}) {
-               $reindex = $opt->{reindex} = {};
-               $reindex->{from} = []; # per-epoch ranges
+               $reindex = $opt->{reindex} = { # per-epoch ranges for v2
+                       from => $ibx->version == 1 ? '' : [],
+               };
                require PublicInbox::SearchIdx;
                PublicInbox::SearchIdx::load_xapian_writable();
        }
@@ -405,16 +410,18 @@ sub cpdb ($$) {
                $ft = File::Temp->newdir("$new.compact-XXXXXX", DIR => $dir);
                setup_signals();
                $tmp = $ft->dirname;
+               nodatacow_dir($tmp);
        } else {
                $tmp = $new;
        }
 
        # like copydatabase(1), be sure we don't overwrite anything in case
        # of other bugs:
-       my $creat = eval($PublicInbox::Search::Xap.'::DB_CREATE()');
+       my $flag = eval($PublicInbox::Search::Xap.'::DB_CREATE()');
        die if $@;
        my $XapianWritableDatabase = $PublicInbox::Search::X{WritableDatabase};
-       my $dst = $XapianWritableDatabase->new($tmp, $creat);
+       $flag |= $PublicInbox::SearchIdx::DB_NO_SYNC if !$opt->{sync};
+       my $dst = $XapianWritableDatabase->new($tmp, $flag);
        my $pr = $opt->{-progress};
        my $pfx = $opt->{-progress_pfx} = progress_pfx($new);
        my $pr_data = { pr => $pr, pfx => $pfx, nr => 0 } if $pr;