lib/PublicInbox/V2Writable.pm | 13 +++++++++++-- script/public-inbox-index | 3 +-- t/purge.t | 3 +-- t/v2reindex.t | 3 +-- t/v2writable.t | 8 ++------ diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm index b92d8d247b8d0b689e67159911d736b3c2a49289..afcac4d2db863103f5e92dfd82bbbeb5301279a5 100644 --- a/lib/PublicInbox/V2Writable.pm +++ b/lib/PublicInbox/V2Writable.pm @@ -24,7 +24,14 @@ # 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 -sub nproc_parts () { +sub nproc_parts ($) { + my ($creat_opt) = @_; + if (ref($creat_opt) eq 'HASH') { + if (defined(my $n = $creat_opt->{nproc})) { + return $n + } + } + my $n = int($ENV{NPROC} || `nproc 2>/dev/null` || 2); # subtract for the main process and git-fast-import $n -= 1; @@ -52,6 +59,8 @@ $nparts; } sub new { + # $creat may be any true value, or 0/undef. A hashref is true, + # and $creat->{nproc} may be set to an integer my ($class, $v2ibx, $creat) = @_; my $dir = $v2ibx->{mainrepo} or die "no mainrepo in inbox\n"; unless (-d $dir) { @@ -80,7 +89,7 @@ # limit each git repo (epoch) to 1GB or so rotate_bytes => int((1024 * 1024 * 1024) / $PACKING_FACTOR), last_commit => [], # git repo -> commit }; - $self->{partitions} = count_partitions($self) || nproc_parts(); + $self->{partitions} = count_partitions($self) || nproc_parts($creat); bless $self, $class; } diff --git a/script/public-inbox-index b/script/public-inbox-index index 2f810a564f01367a592c0862705074e077a193c9..b353093e49250e2296f6c12edaee656dd40fb064 100755 --- a/script/public-inbox-index +++ b/script/public-inbox-index @@ -71,8 +71,7 @@ if (ref($repo) && ($repo->{version} || 1) == 2) { eval { require PublicInbox::V2Writable }; die "v2 requirements not met: $@\n" if $@; my $v2w = eval { - $jobs and local $ENV{NPROC} = $jobs; - PublicInbox::V2Writable->new($repo); + PublicInbox::V2Writable->new($repo, {nproc=>$jobs}); }; if (defined $jobs) { if ($jobs == 0) { diff --git a/t/purge.t b/t/purge.t index b518c26fb0aab488042547c2982c68bdfa9108d0..574935e08e72f1b01eb5700e6a07ba38952d0cb1 100644 --- a/t/purge.t +++ b/t/purge.t @@ -35,12 +35,11 @@ Hello World EOF -local $ENV{NPROC} = '1'; my $cfgfile = "$tmpdir/config"; local $ENV{PI_CONFIG} = $cfgfile; open my $cfg_fh, '>', $cfgfile or die "open: $!"; -my $v2w = PublicInbox::V2Writable->new($ibx, 1); +my $v2w = PublicInbox::V2Writable->new($ibx, {nproc => 1}); my $mime = PublicInbox::MIME->new($raw); ok($v2w->add($mime), 'add message to be purged'); $v2w->done; diff --git a/t/v2reindex.t b/t/v2reindex.t index 8a3071b734af5c763a8192cfafd74e3919e57f7a..c416629c3f4155cc5bc0e5642f64a9b4952747fd 100644 --- a/t/v2reindex.t +++ b/t/v2reindex.t @@ -39,14 +39,13 @@ Date => 'Fri, 02 Oct 1993 00:00:00 +0000', ], body => $agpl, ); -local $ENV{NPROC} = 2; my $minmax; my $msgmap; my ($mark1, $mark2, $mark3, $mark4); { my %config = %$ibx_config; my $ibx = PublicInbox::Inbox->new(\%config); - my $im = PublicInbox::V2Writable->new($ibx, 1); + my $im = PublicInbox::V2Writable->new($ibx, {nproc => 1}); my $im0 = $im->importer(); foreach my $i (1..10) { $mime->header_set('Message-Id', "<$i\@example.com>"); diff --git a/t/v2writable.t b/t/v2writable.t index f8ef415acc51061b30fbd006ee491edb74c7c536..75110155f3fa9bc0f0729e9acaf828740b79e0d3 100644 --- a/t/v2writable.t +++ b/t/v2writable.t @@ -33,10 +33,7 @@ ], body => "hello world\n", ); -my $im = eval { - local $ENV{NPROC} = '1'; - PublicInbox::V2Writable->new($ibx, 1); -}; +my $im = PublicInbox::V2Writable->new($ibx, {nproc => 1}); is($im->{partitions}, 1, 'one partition when forced'); ok($im->add($mime), 'ordinary message added'); foreach my $f ("$mainrepo/msgmap.sqlite3", @@ -201,11 +198,10 @@ my $rover = $n->xrover('1-'); is_deeply([sort keys %lg], [sort keys %$rover], 'XROVER range OK'); }; { - local $ENV{NPROC} = 2; my @log = qw(log --no-decorate --no-abbrev --no-notes --no-color); my @before = $git0->qx(@log, qw(--pretty=oneline)); my $before = $git0->qx(@log, qw(--pretty=raw --raw -r)); - $im = PublicInbox::V2Writable->new($ibx, 1); + $im = PublicInbox::V2Writable->new($ibx, {nproc => 2}); is($im->{partitions}, 1, 'detected single partition from previous'); my $smsg = $im->remove($mime, 'test removal'); $im->done;