sub dbh_new {
my ($self) = @_;
my $dbh = $self->SUPER::dbh_new;
- $dbh->do('PRAGMA synchronous = OFF'); # commit_fsync instead
$dbh->do('PRAGMA journal_mode = TRUNCATE');
$dbh->do('PRAGMA cache_size = 80000');
create_tables($dbh);
$dbh;
}
-sub commit_fsync {
- my $fn = $_[0]->{filename};
- if (open my $fh, '+<', $fn) {
- $fh->sync;
- close $fh;
- }
-}
-
sub get_counter ($$) {
my ($dbh, $key) = @_;
my $sth = $dbh->prepare_cached(<<'', undef, 1);
# issue a write barrier to ensure all data is visible to other processes
# and read-only ops. Order of data importance is: git > SQLite > Xapian
sub barrier {
- my ($self, $fsync) = @_;
+ my ($self) = @_;
if (my $im = $self->{im}) {
$im->barrier;
$_->remote_barrier foreach @$parts;
$over->barrier_wait; # wait for each Xapian partition
- $over->commit_fsync if $fsync;
# last_commit is special, don't commit these until
# remote partitions are done:
my ($im, $old, $new) = @_;
my @st = stat($old) or die "failed to stat($old): $!\n";
- for my $suf (qw(.pipe.lock -journal)) {
- my $orig = "$old/over.sqlite3$suf";
- link($orig, "$new/over.sqlite3$suf") and next;
- next if $!{ENOENT};
- die "failed to link $orig => $new/over.sqlite3$suf: $!\n";
+ my $over = "$old/over.sqlite3";
+ if (-f $over) {
+ require PublicInbox::Over;
+ $over = PublicInbox::Over->new($over);
+ $over->connect->sqlite_backup_to_file("$new/over.sqlite3");
}
- link("$old/over.sqlite3", "$new/over.sqlite3") or die
- "failed to link {$old => $new}/over.sqlite3: $!\n";
-
rename($old, "$new/old") or die "rename $old => $new/old: $!\n";
chmod($st[2] & 07777, $new) or die "chmod $old: $!\n";
rename($new, $old) or die "rename $new => $old: $!\n";