From f50ad8e90c3cca5b8f6ee339a486e3fa0367cd44 Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Tue, 8 Aug 2017 19:47:15 -0700 Subject: [PATCH 1/2] test: check free page counts on close/reopen for freelist overflow Confirm that the number of freed pages exceeds the overflow count, then check that reopening gives the same number of free pages. --- bucket_test.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/bucket_test.go b/bucket_test.go index bcdd1dc..f044142 100644 --- a/bucket_test.go +++ b/bucket_test.go @@ -423,6 +423,22 @@ func TestBucket_Delete_FreelistOverflow(t *testing.T) { }); err != nil { t.Fatal(err) } + + // Check more than an overflow's worth of pages are freed. + stats := db.Stats() + freePages := stats.FreePageN + stats.PendingPageN + if freePages <= 0xFFFF { + t.Fatalf("expected more than 0xFFFF free pages, got %v", freePages) + } + + // Free page count should be preserved on reopen. + if err := db.DB.Close(); err != nil { + t.Fatal(err) + } + db.MustReopen() + if reopenFreePages := db.Stats().FreePageN; freePages != reopenFreePages { + t.Fatalf("expected %d free pages, got %+v", freePages, db.Stats()) + } } // Ensure that accessing and updating nested buckets is ok across transactions. From 03f5e16968ca28cba6431ad6a863b9021bf97d19 Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Tue, 8 Aug 2017 23:34:56 -0700 Subject: [PATCH 2/2] freelist: read all free pages on count overflow count is not shifted up by start index when taking subslice of free list, dropping the last entry in the list. --- freelist.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/freelist.go b/freelist.go index 679fcbb..13ce516 100644 --- a/freelist.go +++ b/freelist.go @@ -245,7 +245,7 @@ func (f *freelist) read(p *page) { if count == 0 { f.ids = nil } else { - ids := ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[idx:count] + ids := ((*[maxAllocSize]pgid)(unsafe.Pointer(&p.ptr)))[idx:idx+count] f.ids = make([]pgid, len(ids)) copy(f.ids, ids)