lib/PublicInbox/V2Writable.pm | 22 ++++++++++++++++++++-- t/v2writable.t | 11 ++++++++++- diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm index 3bcea37defde1f588f96066259e7dc87cb6b9e73..7728b91a542a79727eaed2f627639fdad080cbb0 100644 --- a/lib/PublicInbox/V2Writable.pm +++ b/lib/PublicInbox/V2Writable.pm @@ -19,7 +19,9 @@ # an estimate of the post-packed size to the raw uncompressed size 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 @@ } else { 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), diff --git a/t/v2writable.t b/t/v2writable.t index 2d35aca387d524b145e2fe58844e4a8391778d3d..404c86518fd0382769afa3833c57dbdb90fa67da 100644 --- a/t/v2writable.t +++ b/t/v2writable.t @@ -30,7 +30,11 @@ ], 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 @@ is($nn{$mid}++, 0, "MID is unique in NEWNEWS"); } 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();