-sub search_idx {
- my ($self) = @_;
- $self->{idx} ||= eval {
- my $idx = PublicInbox::SearchIdx->new($self->{-inbox}, 1);
- my $mm = $idx->_msgmap_init;
- $idx->_xdb_acquire->begin_transaction;
- $self->{transact_bytes} = 0;
- $mm->{dbh}->begin_work;
- $idx
- };
+sub idx_part {
+ my ($self, $part) = @_;
+ my $idx = $self->{idx_parts};
+ return $idx->[$part] if $idx; # fast path
+
+ # first time initialization:
+ my $all = $self->{all} =
+ PublicInbox::SearchIdxThread->new($self->{-inbox});
+
+ # need to create all parts before initializing msgmap FD
+ my $max = $self->{partitions} - 1;
+ $idx = $self->{idx_parts} = [];
+ for my $i (0..$max) {
+ push @$idx, PublicInbox::SearchIdxPart->new($self, $i, $all);
+ }
+ $all->_msgmap_init->{dbh}->begin_work;
+ $idx->[$part];