WAL (write-ahead log) improves parallelism for readers when
they also have write access to the SQLite DB. While we
can't use WAL for public-inboxes where the -netd processes
are intended to only have read-only permssions, lei/store
always assumes read-write access.
The lei/store */ei15/over.sqlite3 DB was the only SQLite DB used
by lei without WAL. lei already set WAL for mail_sync.sqlite3
and the saved-searches/*/over.sqlite3 DBs.
Now that all SQLite DBs used by lei are WAL, commit
807abf67
(lei/store: auto-commit for long-running imports, 2024-11-15)
is no longer strictly necessary for parallelism during
long-running imports. However,
807abf67 may continue to be
useful to minimize the need to refetch after a power outage
during `lei import').
For saved-searches, we'll make use of the new mechanism for
setting {journal_mode} per-instance.
my $lk = $self->lock_for_scope; # git-config doesn't wait
my $oidx = PublicInbox::OverIdx->new($self->{-ovf});
$oidx->{-no_fsync} = 1;
+ $oidx->{journal_mode} = 'WAL';
$oidx->dbh;
- if ($creat) {
- $oidx->{dbh}->do('PRAGMA journal_mode = WAL');
- $oidx->eidx_prep; # for xref3
- }
+ $oidx->eidx_prep if $creat; # for xref3
$oidx
};
}
# If an admin is willing to give read-only daemons R/W
# permissions; they can enable WAL manually and we will
# respect that by not clobbering it.
- my $jm = $dbh->selectrow_array('PRAGMA journal_mode');
- $dbh->do('PRAGMA journal_mode = TRUNCATE') if $jm ne 'wal';
+ my $jm = $self->{journal_mode}; # set by lei
+ if (defined $jm) {
+ $dbh->do('PRAGMA journal_mode = '.$jm);
+ } else {
+ $jm = $dbh->selectrow_array('PRAGMA journal_mode');
+ $jm eq 'wal' or
+ $dbh->do('PRAGMA journal_mode = TRUNCATE');
+ }
$dbh->do('PRAGMA synchronous = OFF') if $rw > 1;
}
}
sub create {
- my ($self) = @_;
+ my ($self, $opt) = @_;
my $fn = $self->{filename} // do {
croak('BUG: no {filename}') unless $self->{dbh};
return;
my ($dir) = ($fn =~ m!(.*?/)[^/]+\z!);
File::Path::mkpath($dir);
}
+ $self->{journal_mode} = 'WAL' if $opt->{-private};
# create the DB:
PublicInbox::Over::dbh($self);
$self->dbh_close;
sub _idx_init { # with_umask callback
my ($self, $opt) = @_;
$self->lock_acquire unless $opt && $opt->{-skip_lock};
- $self->{oidx}->create;
+ $self->{oidx}->create($opt);
# xcpdb can change shard count while -watch is idle
my $nshards = count_shards($self);