Skip to content

Commit

Permalink
fix NoSyncFreelist reachability checking
Browse files Browse the repository at this point in the history
* unconditionally free last free list, if valid, when committing txn

* only treat freelist pages as reachable if set to valid pgid

Fixes boltdb#9
  • Loading branch information
Anthony Romano committed Aug 8, 2017
1 parent 2ab139b commit e164176
Showing 1 changed file with 7 additions and 7 deletions.
14 changes: 7 additions & 7 deletions tx.go
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,12 @@ func (tx *Tx) Commit() error {
// Free the old root bucket.
tx.meta.root.root = tx.root.root

// Free the freelist and allocate new pages for it. This will overestimate
// the size of the freelist but not underestimate the size (which would be bad).
if tx.meta.freelist != pgidNoFreelist {
tx.db.freelist.free(tx.meta.txid, tx.db.page(tx.meta.freelist))
}

if !tx.db.NoFreelistSync {
err := tx.commitFreelist()
if err != nil {
Expand Down Expand Up @@ -222,12 +228,6 @@ func (tx *Tx) Commit() error {

func (tx *Tx) commitFreelist() error {
opgid := tx.meta.pgid

// Free the freelist and allocate new pages for it. This will overestimate
// the size of the freelist but not underestimate the size (which would be bad).
if tx.meta.freelist != pgidNoFreelist {
tx.db.freelist.free(tx.meta.txid, tx.db.page(tx.meta.freelist))
}
p, err := tx.allocate((tx.db.freelist.size() / tx.db.pageSize) + 1)
if err != nil {
tx.rollback()
Expand Down Expand Up @@ -408,7 +408,7 @@ func (tx *Tx) check(ch chan error) {
reachable := make(map[pgid]*page)
reachable[0] = tx.page(0) // meta0
reachable[1] = tx.page(1) // meta1
if !tx.DB().NoFreelistSync {
if tx.meta.freelist != pgidNoFreelist {
for i := uint32(0); i <= tx.page(tx.meta.freelist).overflow; i++ {
reachable[tx.meta.freelist+pgid(i)] = tx.page(tx.meta.freelist)
}
Expand Down

0 comments on commit e164176

Please sign in to comment.