From da089825419835c37afbdf7b7c5f0448766bdb27 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 31 Dec 2020 13:51:25 +0000 Subject: lei_to_mail: start atomic and compressed mbox writing We'll allow using multiple workers to write to a single mbox (which could be compressed). This is can be done safely with O_APPEND + syswrite for uncompressed files, and using a lock when piping to pigz/gzip/bzip2/xz. --- t/lei_to_mail.t | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 't') diff --git a/t/lei_to_mail.t b/t/lei_to_mail.t index 089a422e..231cf543 100644 --- a/t/lei_to_mail.t +++ b/t/lei_to_mail.t @@ -62,4 +62,51 @@ for my $mbox (qw(mboxrd mboxo mboxcl mboxcl2)) { } } +my ($tmpdir, $for_destroy) = tmpdir(); +local $ENV{TMPDIR} = $tmpdir; +open my $err, '>>', "$tmpdir/lei.err" or BAIL_OUT $!; +my $lei = { 2 => $err }; +my $buf = <<'EOM'; +From: x@example.com +Subject: x + +blah +EOM +my $fn = "$tmpdir/x.mbox"; +my $orig = do { + my $wcb = PublicInbox::LeiToMail->write_cb("mboxcl2:$fn", $lei); + is(ref $wcb, 'CODE', 'write_cb returned callback'); + ok(-f $fn && !-s _, 'empty file created'); + $wcb->(\(my $dup = $buf), 'deadbeef', [ qw(seen) ]); + undef $wcb; + open my $fh, '<', $fn or BAIL_OUT $!; + my $raw = do { local $/; <$fh> }; + like($raw, qr/^blah\n/sm, 'wrote content'); + unlink $fn or BAIL_OUT $!; + + local $lei->{opt} = { jobs => 2 }; + $wcb = PublicInbox::LeiToMail->write_cb("mboxcl2:$fn", $lei); + $wcb->(\($dup = $buf), 'deadbeef', [ qw(seen) ]); + undef $wcb; + open $fh, '<', $fn or BAIL_OUT $!; + is($raw, do { local $/; <$fh> }, 'jobs > 1'); + $raw; +}; +SKIP: { + use PublicInbox::Spawn qw(which); + my $gzip = which('gzip') or skip 'gzip not found', 1; + my $wcb = PublicInbox::LeiToMail->write_cb("mboxcl2:$fn.gz", $lei); + $wcb->(\(my $dup = $buf), 'deadbeef', [ qw(seen) ]); + undef $wcb; + my $uncompressed = xqx([$gzip, '-dc', "$fn.gz"]); + is($uncompressed, $orig, 'gzip works'); + + local $lei->{opt} = { jobs => 2 }; + unlink "$fn.gz" or die "unlink $!"; + $wcb = PublicInbox::LeiToMail->write_cb("mboxcl2:$fn.gz", $lei); + $wcb->(\(my $dupe = $buf), 'deadbeef', [ qw(seen) ]); + undef $wcb; + is(xqx([$gzip, '-dc', "$fn.gz"]), $orig); +} + done_testing; -- cgit v1.2.3-24-ge0c7