diff options
author | Ben Johnson <benbjohnson@yahoo.com> | 2014-04-11 15:11:55 -0600 |
---|---|---|
committer | Ben Johnson <benbjohnson@yahoo.com> | 2014-04-11 15:11:55 -0600 |
commit | 2c8020ec8e98e7b6c6c0fd3bd6e91d41caf7f25a (patch) | |
tree | 125c24e03c653417ce8bf5965b7fbcbeb2dedb04 /freelist.go | |
parent | Merge pull request #128 from benbjohnson/import-export (diff) | |
parent | Upgrade import/export to use nested buckets. (diff) | |
download | dedo-2c8020ec8e98e7b6c6c0fd3bd6e91d41caf7f25a.tar.gz dedo-2c8020ec8e98e7b6c6c0fd3bd6e91d41caf7f25a.tar.xz |
Merge pull request #127 from benbjohnson/nested-keys
Add nested buckets.
Diffstat (limited to 'freelist.go')
-rw-r--r-- | freelist.go | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/freelist.go b/freelist.go index cb58a54..ebe2810 100644 --- a/freelist.go +++ b/freelist.go @@ -62,6 +62,8 @@ func (f *freelist) free(txid txid, p *page) { ids = append(ids, p.id+pgid(i)) } f.pending[txid] = ids + + // DEBUG ONLY: f.check() } // release moves all page ids for a transaction id (or older) to the freelist. @@ -109,6 +111,29 @@ func (f *freelist) write(p *page) { copy(((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[:], ids) } +// check verifies there are no double free pages. +// This is slow so it should only be used while debugging. +// If errors are found then a panic invoked. +/* +func (f *freelist) check() { + var lookup = make(map[pgid]txid) + for _, id := range f.ids { + if _, ok := lookup[id]; ok { + panic(fmt.Sprintf("page %d already freed", id)) + } + lookup[id] = 0 + } + for txid, m := range f.pending { + for _, id := range m { + if _, ok := lookup[id]; ok { + panic(fmt.Sprintf("tx %d: page %d already freed in tx %d", txid, id, lookup[id])) + } + lookup[id] = txid + } + } +} +*/ + type reverseSortedPgids []pgid func (s reverseSortedPgids) Len() int { return len(s) } |