about summary refs log tree commit homepage
path: root/lib/PublicInbox/Admin.pm
diff options
context:
space:
mode:
authorEric Wong <e@yhbt.net>2020-08-10 02:12:02 +0000
committerEric Wong <e@yhbt.net>2020-08-10 06:26:24 +0000
commit073e4082a07ddeebf7c3efcadde35d98adb21c92 (patch)
treeca091742f9c1d8e539cf38f82c295218996d067f /lib/PublicInbox/Admin.pm
parenta27beb758ec7097768416966cf4a7b6984ef5da6 (diff)
downloadpublic-inbox-073e4082a07ddeebf7c3efcadde35d98adb21c92.tar.gz
Converting v1 inboxes from v2 can be a painful experience
on HDD.  Some of the new options in the CLI or config
file make it less painful.
Diffstat (limited to 'lib/PublicInbox/Admin.pm')
-rw-r--r--lib/PublicInbox/Admin.pm36
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/PublicInbox/Admin.pm b/lib/PublicInbox/Admin.pm
index 8a9a81c9..ce720beb 100644
--- a/lib/PublicInbox/Admin.pm
+++ b/lib/PublicInbox/Admin.pm
@@ -265,4 +265,40 @@ sub parse_unsigned ($) {
         1;
 }
 
+sub index_prepare ($$) {
+        my ($opt, $cfg) = @_;
+        my $env;
+        if ($opt->{compact}) {
+                require PublicInbox::Xapcmd;
+                PublicInbox::Xapcmd::check_compact();
+                $opt->{compact_opt} = { -coarse_lock => 1, compact => 1 };
+                if (defined(my $jobs = $opt->{jobs})) {
+                        $opt->{compact_opt}->{jobs} = $jobs;
+                }
+        }
+        for my $k (qw(max_size batch_size)) {
+                my $git_key = "publicInbox.index".ucfirst($k);
+                $git_key =~ s/_([a-z])/\U$1/g;
+                defined(my $v = $opt->{$k} // $cfg->{lc($git_key)}) or next;
+                parse_unsigned(\$v) or die "`$git_key=$v' not parsed\n";
+                $v > 0 or die "`$git_key=$v' must be positive\n";
+                $opt->{$k} = $v;
+        }
+
+        # out-of-the-box builds of Xapian 1.4.x are still limited to 32-bit
+        # https://getting-started-with-xapian.readthedocs.io/en/latest/concepts/indexing/limitations.html
+        $opt->{batch_size} and
+                $env = { XAPIAN_FLUSH_THRESHOLD => '4294967295' };
+
+        for my $k (qw(sequential_shard)) {
+                my $git_key = "publicInbox.index".ucfirst($k);
+                $git_key =~ s/_([a-z])/\U$1/g;
+                defined(my $s = $opt->{$k} // $cfg->{lc($git_key)}) or next;
+                defined(my $v = $cfg->git_bool($s))
+                                        or die "`$git_key=$s' not boolean\n";
+                $opt->{$k} = $v;
+        }
+        $env;
+}
+
 1;