topdir => $dir,
creat => $opt->{creat},
ibx_map => {}, # (newsgroup//inboxdir) => $ibx
- ibx_list => [],
+ ibx_cfg => [], # by config section order
indexlevel => $l,
transact_bytes => 0,
total_bytes => 0,
sub attach_inbox {
my ($self, $ibx) = @_;
$self->{ibx_map}->{$ibx->eidx_key} //= do {
- push @{$self->{ibx_list}}, $ibx;
+ delete $self->{-ibx_ary}; # invalidate cache
+ push @{$self->{ibx_cfg}}, $ibx;
$ibx;
}
}
my ($self, $sync, $smsg) = @_;
my $ibx_id = delete($smsg->{ibx_id}) // die '{ibx_id} unset';
my $pos = $sync->{id2pos}->{$ibx_id} // die "$ibx_id no pos";
- $self->{ibx_list}->[$pos] // die "BUG: ibx for $smsg->{blob} not mapped"
+ $self->{-ibx_ary}->[$pos] // die "BUG: ibx for $smsg->{blob} not mapped"
}
sub _fd_constrained ($) {
chomp($soft = `sh -c 'ulimit -n'`);
}
if (defined($soft)) {
- my $want = scalar(@{$self->{ibx_list}}) + 64; # estimate
+ my $want = scalar(@{$self->{-ibx_ary}}) + 64; # estimate
my $ret = $want > $soft;
if ($ret) {
warn <<EOF;
return;
}
- # we sort {xr3r} in the reverse order of {ibx_list} so we can
+ # we sort {xr3r} in the reverse order of ibx_sorted so we can
# hit the common case in _reindex_finalize without rereading
# from git (or holding multiple messages in memory).
- my $id2pos = $sync->{id2pos}; # index in {ibx_list}
+ my $id2pos = $sync->{id2pos}; # index in ibx_sorted
@$xr3 = sort {
$id2pos->{$b->[0]} <=> $id2pos->{$a->[0]}
||
undef;
}
+sub ibx_sorted ($) {
+ my ($self) = @_;
+ $self->{-ibx_ary} //= do {
+ # highest boost first, stable for config-ordering tiebreaker
+ use sort 'stable';
+ [ sort {
+ ($b->{boost} // 0) <=> ($a->{boost} // 0)
+ } @{$self->{ibx_cfg}} ];
+ }
+}
+
sub eidxq_process ($$) { # for reindexing
my ($self, $sync) = @_;
$sync->{id2pos} //= do {
my %id2pos;
my $pos = 0;
- $id2pos{$_->{-ibx_id}} = $pos++ for @{$self->{ibx_list}};
+ $id2pos{$_->{-ibx_id}} = $pos++ for (@{ibx_sorted($self)});
\%id2pos;
};
my ($del, $iter);
warn "E: aborting --reindex\n";
return;
}
- for my $ibx (@{$self->{ibx_list}}) {
+ for my $ibx (@{ibx_sorted($self)}) {
_reindex_inbox($self, $sync, $ibx);
last if $sync->{quit};
}
local $SIG{QUIT} = $quit;
local $SIG{INT} = $quit;
local $SIG{TERM} = $quit;
- for my $ibx (@{$self->{ibx_list}}) {
+ for my $ibx (@{ibx_sorted($self)}) {
$ibx->{-ibx_id} //= $self->{oidx}->ibx_id($ibx->eidx_key);
}
if (delete($opt->{dedupe})) {
# don't use $_ here, it'll get clobbered by reindex_checkpoint
if ($opt->{scan} // 1) {
- for my $ibx (@{$self->{ibx_list}}) {
+ for my $ibx (@{ibx_sorted($self)}) {
last if $sync->{quit};
sync_inbox($self, $sync, $ibx);
}
}
undef $dh;
}
- for my $ibx (@{$self->{ibx_list}}) {
+ for my $ibx (@{ibx_sorted($self)}) {
# create symlinks for multi-pack-index
$git_midx += symlink_packs($ibx, $pd);
# add new lines to our alternates file
my $pr = $self->{-watch_sync}->{-opt}->{-progress};
$pr->('reloading ...') if $pr;
delete $self->{-resync_queue};
- @{$self->{ibx_list}} = ();
+ delete $self->{-ibx_ary};
+ $self->{ibx_cfg} = [];
%{$self->{ibx_map}} = ();
delete $self->{-watch_sync}->{id2pos};
my $cfg = PublicInbox::Config->new;
sub eidx_resync_start ($) { # -extindex --watch SIGUSR1 handler
my ($self) = @_;
- $self->{-resync_queue} //= [ @{$self->{ibx_list}} ];
+ $self->{-resync_queue} //= [ @{ibx_sorted($self)} ];
PublicInbox::DS::requeue($self); # trigger our ->event_step
}
require PublicInbox::Sigfd;
my $idler = PublicInbox::InboxIdle->new($self->{cfg});
if (!$self->{cfg}) {
- $idler->watch_inbox($_) for @{$self->{ibx_list}};
+ $idler->watch_inbox($_) for (@{ibx_sorted($self)});
}
- $_->subscribe_unlock(__PACKAGE__, $self) for @{$self->{ibx_list}};
+ $_->subscribe_unlock(__PACKAGE__, $self) for (@{ibx_sorted($self)});
my $pr = $opt->{-progress};
$pr->("performing initial scan ...\n") if $pr;
my $sync = eidx_sync($self, $opt); # initial sync
ok($es->has_threadid, '->has_threadid');
}
+if ('with boost') {
+ xsys([qw(git config publicinbox.v1test.boost), 10],
+ { GIT_CONFIG => $cfg_path });
+ ok(run_script([qw(-extindex --all), "$home/extindex-b"]),
+ 'extindex init with boost');
+ my $es = PublicInbox::ExtSearch->new("$home/extindex-b");
+ my $smsg = $es->over->get_art(1);
+ ok($smsg, 'got first article');
+ my $xref3 = $es->over->get_xref3($smsg->{num});
+ my @v1 = grep(/\Av1/, @$xref3);
+ my @v2 = grep(/\Av2/, @$xref3);
+ like($v1[0], qr/\Av1\.example.*?\b\Q$smsg->{blob}\E\b/,
+ 'smsg->{blob} respected boost');
+ is(scalar(@$xref3), 2, 'only to entries');
+ undef $es;
+
+ xsys([qw(git config publicinbox.v2test.boost), 20],
+ { GIT_CONFIG => $cfg_path });
+ ok(run_script([qw(-extindex --all --reindex), "$home/extindex-b"]),
+ 'extindex --reindex with altered boost');
+
+ $es = PublicInbox::ExtSearch->new("$home/extindex-b");
+ $smsg = $es->over->get_art(1);
+ like($v2[0], qr/\Av2\.example.*?\b\Q$smsg->{blob}\E\b/,
+ 'smsg->{blob} respects boost after reindex');
+
+ xsys([qw(git config --unset publicinbox.v1test.boost)],
+ { GIT_CONFIG => $cfg_path });
+ xsys([qw(git config --unset publicinbox.v2test.boost)],
+ { GIT_CONFIG => $cfg_path });
+}
+
{ # TODO: -extindex should write this to config
open $fh, '>>', $cfg_path or BAIL_OUT $!;
print $fh <<EOF or BAIL_OUT $!;