From: Eric Wong Date: Tue, 12 Oct 2021 11:47:04 +0000 (+0000) Subject: msgmap: ->new_file to supports $ibx arg, drop ->new X-Git-Tag: v1.7.0~179 X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=commitdiff_plain;h=9f02576da775abf208f5a03c03b6f7abd72596d0 msgmap: ->new_file to supports $ibx arg, drop ->new The original Msgmap->new API was v1-specific and not necessary. The ->new_file API now supports an $ibx object being passed to it, simplify -no_fsync use. It will also make an upcoming change easier... --- diff --git a/lib/PublicInbox/Inbox.pm b/lib/PublicInbox/Inbox.pm index 61d153bf..74b8a74f 100644 --- a/lib/PublicInbox/Inbox.pm +++ b/lib/PublicInbox/Inbox.pm @@ -148,7 +148,7 @@ sub mm { $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 65539781..17dfbe18 100644 --- a/lib/PublicInbox/InboxWritable.pm +++ b/lib/PublicInbox/InboxWritable.pm @@ -47,7 +47,7 @@ sub _init_v1 { 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 978730e2..94a0cbeb 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 bebe904b..a2ed9499 100644 --- a/lib/PublicInbox/SearchIdx.pm +++ b/lib/PublicInbox/SearchIdx.pm @@ -453,8 +453,7 @@ sub _msgmap_init ($) { 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 d04cdda6..efcc1fc2 100644 --- a/lib/PublicInbox/V2Writable.pm +++ b/lib/PublicInbox/V2Writable.pm @@ -267,9 +267,7 @@ sub _idx_init { # with_umask callback # 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 87635b19..3ce08a6a 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 @@ EOF }; { - 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 47ebec85..281a09d5 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 @@ Message-ID: 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 81799451..4e9695e1 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 752e5af9..4bec6a2f 100644 --- a/t/init.t +++ b/t/init.t @@ -199,7 +199,8 @@ SKIP: { $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 2d462dfb..a3b7200f 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");