#!perl -w # Copyright (C) 2020-2021 all contributors # License: AGPL-3.0+ use strict; use v5.10.1; use PublicInbox::TestCommon; use PublicInbox::Eml; use PublicInbox::IPC; use File::Path qw(mkpath); use IO::Handle (); # autoflush use POSIX qw(_exit); use Cwd qw(getcwd abs_path); use File::Spec; my $many_root = $ENV{TEST_MANY_ROOT} or plan skip_all => 'TEST_MANY_ROOT not defined'; my $cwd = getcwd(); mkpath($many_root); -d $many_root or BAIL_OUT "$many_root: $!"; $many_root = abs_path($many_root); $many_root =~ m!\A\Q$cwd\E/! and BAIL_OUT "$many_root must not be in $cwd"; require_git 2.6; require_mods(qw(DBD::SQLite Search::Xapian)); use_ok 'PublicInbox::V2Writable'; my $nr_inbox = $ENV{NR_INBOX} // 10; my $nproc = $ENV{NPROC} || PublicInbox::IPC::detect_nproc() || 2; my $indexlevel = $ENV{TEST_INDEXLEVEL} // 'basic'; diag "NR_INBOX=$nr_inbox NPROC=$nproc TEST_INDEXLEVEL=$indexlevel"; diag "TEST_MANY_ROOT=$many_root"; my $level_cfg = $indexlevel eq 'full' ? '' : "\tindexlevel = $indexlevel\n"; my $pfx = "$many_root/$nr_inbox-$indexlevel"; mkpath($pfx); open my $cfg_fh, '>>', "$pfx/config" or BAIL_OUT $!; $cfg_fh->autoflush(1); my $v2_init_add = sub { my ($i) = @_; my $ibx = PublicInbox::Inbox->new({ inboxdir => "$pfx/test-$i", name => "test-$i", newsgroup => "inbox.comp.test.foo.test-$i", address => [ "test-$i\@example.com" ], url => [ "//example.com/test-$i" ], version => 2, -no_fsync => 1, }); $ibx->{indexlevel} = $indexlevel if $level_cfg ne ''; my $entry = <{name}"] address = $ibx->{-primary_address} url = $ibx->{url}->[0] newsgroup = $ibx->{newsgroup} inboxdir = $ibx->{inboxdir} EOF $entry .= $level_cfg; print $cfg_fh $entry or die $!; my $v2w = PublicInbox::V2Writable->new($ibx, { nproc => 0 }); $v2w->init_inbox(0); $v2w->add(PublicInbox::Eml->new(< To: test-$i\@example.com Message-ID: <20101002-000000-$i\@example.com> Subject: hello world $i hi EOM $v2w->done; }; my @children; for my $i (1..$nproc) { my ($r, $w); pipe($r, $w) or BAIL_OUT $!; my $pid = fork // BAIL_OUT "fork: $!"; if ($pid == 0) { close $w; while (my $i = <$r>) { chomp $i; $v2_init_add->($i); } _exit(0); } close $r or BAIL_OUT $!; push @children, [ $w, $pid ]; $w->autoflush(1); } for my $i (0..$nr_inbox) { print { $children[$i % @children]->[0] } "$i\n" or BAIL_OUT $!; } for my $c (@children) { close $c->[0] or BAIL_OUT "close $!"; } my $i = 0; for my $c (@children) { my $pid = waitpid($c->[1], 0); is($?, 0, ++$i.' exited ok'); } ok(close($cfg_fh), 'config written'); done_testing;