]> Sergey Matveev's repositories - public-inbox.git/commitdiff
v2writable: detect and use previous partition count
authorEric Wong (Contractor, The Linux Foundation) <e@80x24.org>
Tue, 6 Mar 2018 07:28:56 +0000 (07:28 +0000)
committerEric Wong (Contractor, The Linux Foundation) <e@80x24.org>
Tue, 6 Mar 2018 07:28:56 +0000 (07:28 +0000)
We need to detect the number of partitions the repository was
created with to ensure Xapian DBs can work across different
machines (or even CPU affinity changes) without leaving messages
unaffected by search.

lib/PublicInbox/V2Writable.pm
t/v2writable.t

index 3bcea37defde1f588f96066259e7dc87cb6b9e73..7728b91a542a79727eaed2f627639fdad080cbb0 100644 (file)
@@ -19,7 +19,9 @@ use PublicInbox::Inbox;
 my $PACKING_FACTOR = 0.4;
 
 # assume 2 cores if GNU nproc(1) is not available
-my $NPROC = int($ENV{NPROC} || `nproc 2>/dev/null` || 2);
+sub nproc () {
+       int($ENV{NPROC} || `nproc 2>/dev/null` || 2);
+}
 
 sub new {
        my ($class, $v2ibx, $creat) = @_;
@@ -32,12 +34,28 @@ sub new {
                        die "$dir does not exist\n";
                }
        }
+
+       my $nparts = 0;
+       my $xpfx = "$dir/xap" . PublicInbox::Search::SCHEMA_VERSION;
+
+       # always load existing partitions in case core count changes:
+       if (-d $xpfx) {
+               foreach my $part (<$xpfx/*>) {
+                       -d $part && $part =~ m!/\d+\z! or next;
+                       eval {
+                               Search::Xapian::Database->new($part)->close;
+                               $nparts++;
+                       };
+               }
+       }
+       $nparts = nproc() if ($nparts == 0);
+
        my $self = {
                -inbox => $v2ibx,
                im => undef, #  PublicInbox::Import
                xap_rw => undef, # PublicInbox::V2SearchIdx
                xap_ro => undef,
-               partitions => $NPROC,
+               partitions => $nparts,
                transact_bytes => 0,
                # limit each repo to 1GB or so
                rotate_bytes => int((1024 * 1024 * 1024) / $PACKING_FACTOR),
index 2d35aca387d524b145e2fe58844e4a8391778d3d..404c86518fd0382769afa3833c57dbdb90fa67da 100644 (file)
@@ -30,7 +30,11 @@ my $mime = PublicInbox::MIME->create(
        body => "hello world\n",
 );
 
-my $im = PublicInbox::V2Writable->new($ibx, 1);
+my $im = eval {
+       local $ENV{NPROC} = '1';
+       PublicInbox::V2Writable->new($ibx, 1);
+};
+is($im->{partitions}, 1, 'one partition when forced');
 ok($im->add($mime), 'ordinary message added');
 
 if ('ensure git configs are correct') {
@@ -182,5 +186,10 @@ EOF
        }
        is_deeply([sort keys %nn], [sort keys %uniq]);
 };
+{
+       local $ENV{NPROC} = 2;
+       $im = PublicInbox::V2Writable->new($ibx, 1);
+       is($im->{partitions}, 1, 'detected single partition from previous');
+}
 
 done_testing();