Skip to content

Commit 12923fe

Browse files
author
Anthony Romano
authored
Merge pull request #12 from heyitsanthony/skip-freelist-overflow
freelist: read all free pages on count overflow
2 parents b219ffc + 03f5e16 commit 12923fe

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

bucket_test.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,22 @@ func TestBucket_Delete_FreelistOverflow(t *testing.T) {
423423
}); err != nil {
424424
t.Fatal(err)
425425
}
426+
427+
// Check more than an overflow's worth of pages are freed.
428+
stats := db.Stats()
429+
freePages := stats.FreePageN + stats.PendingPageN
430+
if freePages <= 0xFFFF {
431+
t.Fatalf("expected more than 0xFFFF free pages, got %v", freePages)
432+
}
433+
434+
// Free page count should be preserved on reopen.
435+
if err := db.DB.Close(); err != nil {
436+
t.Fatal(err)
437+
}
438+
db.MustReopen()
439+
if reopenFreePages := db.Stats().FreePageN; freePages != reopenFreePages {
440+
t.Fatalf("expected %d free pages, got %+v", freePages, db.Stats())
441+
}
426442
}
427443

428444
// Ensure that accessing and updating nested buckets is ok across transactions.

freelist.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ func (f *freelist) read(p *page) {
245245
if count == 0 {
246246
f.ids = nil
247247
} else {
248-
ids := ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[idx:count]
248+
ids := ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[idx:idx+count]
249249
f.ids = make([]pgid, len(ids))
250250
copy(f.ids, ids)
251251

0 commit comments

Comments
 (0)