lib/PublicInbox/Inbox.pm | 2 +- lib/PublicInbox/InboxWritable.pm | 2 +- lib/PublicInbox/Msgmap.pm | 20 +++++++++----------- lib/PublicInbox/SearchIdx.pm | 3 +-- lib/PublicInbox/V2Writable.pm | 4 +--- t/altid.t | 4 ++-- t/altid_v2.t | 4 ++-- t/filter_rubylang.t | 2 +- t/init.t | 3 ++- t/msgmap.t | 5 +++-- diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index 61d153bfab289c4885bfe828163ab48891467754..74b8a74f8856e7992fd29b742ff89f75d1dddaf3 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -148,7 +148,7 @@ my ($self, $req) = @_; $self->{mm} //= eval { require PublicInbox::Msgmap; _cleanup_later($self); - PublicInbox::Msgmap->new_file(mm_file($self)); + PublicInbox::Msgmap->new_file($self); } // ($req ? croak("E: $@") : undef); } diff --git a/lib/PublicInbox/InboxWritable.pm b/lib/PublicInbox/InboxWritable.pm index 655397810c038b3f3f2fb495cfd57602e46dc5c2..17dfbe18500a6dfa00e87f50209baec4126f61c3 100644 --- a/lib/PublicInbox/InboxWritable.pm +++ b/lib/PublicInbox/InboxWritable.pm @@ -47,7 +47,7 @@ require PublicInbox::SearchIdx; require PublicInbox::Msgmap; my $sidx = PublicInbox::SearchIdx->new($self, 1); # just create $sidx->begin_txn_lazy; - my $mm = PublicInbox::Msgmap->new($self->{inboxdir}, 1); + my $mm = PublicInbox::Msgmap->new_file($self, 1); if (defined $skip_artnum) { $mm->{dbh}->begin_work; $mm->skip_artnum($skip_artnum); diff --git a/lib/PublicInbox/Msgmap.pm b/lib/PublicInbox/Msgmap.pm index 978730e2fe59deb6966acaf37f0bc3596eb0c402..94a0cbeb5f6a6f6f445839b45f0f73d5c5c71406 100644 --- a/lib/PublicInbox/Msgmap.pm +++ b/lib/PublicInbox/Msgmap.pm @@ -14,19 +14,17 @@ use DBI; use DBD::SQLite; use PublicInbox::Over; use PublicInbox::Spawn; - -sub new { - my ($class, $git_dir, $writable) = @_; - my $d = "$git_dir/public-inbox"; - if ($writable && !-d $d && !mkdir $d) { - my $err = $!; - -d $d or die "$d not created: $err"; - } - new_file($class, "$d/msgmap.sqlite3", $writable); -} +use Scalar::Util qw(blessed); sub new_file { - my ($class, $f, $rw) = @_; + my ($class, $ibx, $rw) = @_; + my $f; + if (blessed($ibx)) { + $f = $ibx->mm_file; + $rw = 2 if $rw && $ibx->{-no_fsync}; + } else { + $f = $ibx; + } return if !$rw && !-r $f; my $self = bless { filename => $f }, $class; diff --git a/lib/PublicInbox/SearchIdx.pm b/lib/PublicInbox/SearchIdx.pm index bebe904b783a990491c41ac1a8cd667a1530d733..a2ed94993993ac6d03c5505bad916a5f192583a7 100644 --- a/lib/PublicInbox/SearchIdx.pm +++ b/lib/PublicInbox/SearchIdx.pm @@ -453,8 +453,7 @@ my ($self) = @_; die "BUG: _msgmap_init is only for v1\n" if $self->{ibx}->version != 1; $self->{mm} //= eval { require PublicInbox::Msgmap; - my $rw = $self->{ibx}->{-no_fsync} ? 2 : 1; - PublicInbox::Msgmap->new($self->{ibx}->{inboxdir}, $rw); + PublicInbox::Msgmap->new_file($self->{ibx}, 1); }; } diff --git a/lib/PublicInbox/V2Writable.pm b/lib/PublicInbox/V2Writable.pm index d04cdda6e3dc2eeaff75096fa92c25e0e96ecd0e..efcc1fc21a18e0a23ba26cf12311d7355220bd7f 100644 --- a/lib/PublicInbox/V2Writable.pm +++ b/lib/PublicInbox/V2Writable.pm @@ -267,9 +267,7 @@ my $ibx = $self->{ibx} or return; # ExtIdxSearch # Now that all subprocesses are up, we can open the FDs # for SQLite: - my $mm = $self->{mm} = PublicInbox::Msgmap->new_file( - "$ibx->{inboxdir}/msgmap.sqlite3", - $ibx->{-no_fsync} ? 2 : 1); + my $mm = $self->{mm} = PublicInbox::Msgmap->new_file($ibx, 1); $mm->{dbh}->begin_work; } diff --git a/t/altid.t b/t/altid.t index 87635b19a37513233517679a1bcf292694d905f2..3ce08a6a42ab74b19d6d045bb0650311fa3ebad1 100644 --- a/t/altid.t +++ b/t/altid.t @@ -15,7 +15,7 @@ my $altid = [ "serial:gmane:file=$alt_file" ]; my $ibx; { - my $mm = PublicInbox::Msgmap->new_file($alt_file, 1); + my $mm = PublicInbox::Msgmap->new_file($alt_file, 2); is($mm->mid_set(1234, 'a@example.com'), 1, 'mid_set once OK'); ok(0 == $mm->mid_set(1234, 'a@example.com'), 'mid_set not idempotent'); ok(0 == $mm->mid_set(1, 'a@example.com'), 'mid_set fails with dup MID'); @@ -48,7 +48,7 @@ is($mset->size, 0, 'body did NOT match'); }; { - my $mm = PublicInbox::Msgmap->new_file($alt_file, 1); + my $mm = PublicInbox::Msgmap->new_file($alt_file, 2); my ($min, $max) = $mm->minmax; my $num = $mm->mid_insert('b@example.com'); ok($num > $max, 'auto-increment goes beyond mid_set'); diff --git a/t/altid_v2.t b/t/altid_v2.t index 47ebec85ff8e9b42fd0afbd12fcff3fb5fcfcb27..281a09d51dd0cfe4af5ed0b5590ec97b8a74b68c 100644 --- a/t/altid_v2.t +++ b/t/altid_v2.t @@ -13,7 +13,7 @@ my $altid = [ "serial:gmane:file=$another" ]; my $ibx = create_inbox 'v2', version => 2, indexlevel => 'medium', altid => $altid, sub { my ($im, $ibx) = @_; - my $mm = PublicInbox::Msgmap->new_file("$ibx->{inboxdir}/$another", 1); + my $mm = PublicInbox::Msgmap->new_file("$ibx->{inboxdir}/$another", 2); $mm->mid_set(1234, 'a@example.com') == 1 or BAIL_OUT 'mid_set once'; ok(0 == $mm->mid_set(1234, 'a@example.com'), 'mid_set not idempotent'); ok(0 == $mm->mid_set(1, 'a@example.com'), 'mid_set fails with dup MID'); @@ -26,7 +26,7 @@ hello world gmane:666 EOF }; -my $mm = PublicInbox::Msgmap->new_file("$ibx->{inboxdir}/$another", 1); +my $mm = PublicInbox::Msgmap->new_file("$ibx->{inboxdir}/$another", 2); ok(0 == $mm->mid_set(1234, 'a@example.com'), 'mid_set not idempotent'); ok(0 == $mm->mid_set(1, 'a@example.com'), 'mid_set fails with dup MID'); my $mset = $ibx->search->mset('gmane:1234'); diff --git a/t/filter_rubylang.t b/t/filter_rubylang.t index 817994512125c8baa435fee8169e4cae87e4954a..4e9695e13eb663a361760e43418aa9b5a4c5ff1f 100644 --- a/t/filter_rubylang.t +++ b/t/filter_rubylang.t @@ -44,7 +44,7 @@ EOF $mime = PublicInbox::Eml->new($msg); $ret = $f->delivery($mime); is($ret, $mime, "delivery successful"); - my $mm = PublicInbox::Msgmap->new($git_dir); + my $mm = $ibx->mm; is($mm->num_for('a@b'), 12, 'MM entry created based on X-ML-Count'); $msg = <<'EOF'; diff --git a/t/init.t b/t/init.t index 752e5af93c0b60ce519cf838331494a2d5c8c472..4bec6a2f31311a66e0ea5777440aec30c67b68e1 100644 --- a/t/init.t +++ b/t/init.t @@ -199,7 +199,8 @@ ok(run_script($cmd), '--skip-artnum -V1'); $err = ''; ok(run_script([qw(-mda --no-precheck)], $env, $rdr), 'deliver V1'); diag "err=$err" if $err; - $mm = PublicInbox::Msgmap->new("$tmpdir/skip4"); + $mm = PublicInbox::Msgmap->new_file( + "$tmpdir/skip4/public-inbox/msgmap.sqlite3"); $n = $mm->num_for($mid); is($n, 13, 'V1 NNTP article numbers skipped via --skip-artnum'); } diff --git a/t/msgmap.t b/t/msgmap.t index 2d462dfb0fa5952114331ab83266a3a968946469..a3b7200f16a566c39041f586c9fc9f97b665de3e 100644 --- a/t/msgmap.t +++ b/t/msgmap.t @@ -7,7 +7,8 @@ use PublicInbox::TestCommon; require_mods('DBD::SQLite'); use_ok 'PublicInbox::Msgmap'; my ($tmpdir, $for_destroy) = tmpdir(); -my $d = PublicInbox::Msgmap->new($tmpdir, 1); +my $f = "$tmpdir/msgmap.sqlite3"; +my $d = PublicInbox::Msgmap->new_file($f, 1); my %mid2num; my %num2mid; @@ -50,7 +51,7 @@ is($d->mid_delete('a@b') + 0, 0, 'delete again returns zero'); is(undef, $d->num_for('a@b'), 'num_for fails on deleted msg'); $d = undef; -ok($d = PublicInbox::Msgmap->new($tmpdir, 1), 'idempotent DB creation'); +ok($d = PublicInbox::Msgmap->new_file($f, 1), 'idempotent DB creation'); my ($min, $max) = $d->minmax; ok($min > 0, "article min OK"); ok($max > 0 && $max < 10, "article max OK");