don't fsync on RBF Open if WAL is empty

This is targeted at reducing startup times, especially on OSX where
the fsync calls seem to be taking an egregiously long time. I got one
index to go from ~1min to open to ~1sec. This looks safe to me, but
will get opinions from RBF experts.
This commit is contained in:
Matthew Jaffee 2021-10-27 15:08:58 -05:00
parent 115b1a9c6a
commit c3e14cb9ae

View file

@ -206,6 +206,13 @@ func (db *DB) checkpoint() error {
return nil // skip if transactions open
}
// Check if there are any WAL pages, if not do nothing as
// checkpointing and calling fsync can be very expensive even if
// there are no writes.
if db.walPageN == 0 {
return nil
}
for i := 0; i < db.walPageN; i++ {
page, err := db.readWALPageAt(i)
if err != nil {
@ -245,7 +252,7 @@ func (db *DB) checkpoint() error {
db.walPageN = 0
db.pageMap = NewPageMap()
// Notify halted tranactions that the WAL has been checkpointed.
// Notify halted transactions that the WAL has been checkpointed.
db.haltCond.Broadcast()
return nil