Skip to content

Commit

Permalink
ensure hashmap init clears maps
Browse files Browse the repository at this point in the history
This reorders some statements in the hashmap initialization to ensure we
always start fresh, even when no pageids were passed to it.

fixes #791

Signed-off-by: Thomas Jungblut <[email protected]>
  • Loading branch information
tjungblu committed Jul 22, 2024
1 parent efc3eb6 commit 8e104b4
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 8 deletions.
24 changes: 24 additions & 0 deletions internal/freelist/freelist_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,30 @@ func TestFreelist_releaseRange(t *testing.T) {
}
}

func TestFreeList_reload_page_dedupe(t *testing.T) {
buf := make([]byte, 4096)
f := newTestFreelist()
f.Init([]common.Pgid{5, 6, 8})

p := common.LoadPage(buf)
f.Write(p)

f2 := newTestFreelist()
f.Init([]common.Pgid{})

f2.Free(common.Txid(5), common.NewPage(5, common.LeafPageFlag, 0, 4))

// reload should deduplicate as a pending page when reading from p's freelist
f2.Reload(p)

if len(f2.freePageIds()) != 0 {
t.Fatalf("expected empty; got=%v", f2.freePageIds())
}
if exp := []common.Pgid{5, 6, 7, 8, 9}; !reflect.DeepEqual(exp, f2.pendingPageIds()[5].ids) {
t.Fatalf("exp=%v; got=%v", exp, f2.pendingPageIds()[5].ids)
}
}

// Ensure that a freelist can deserialize from a freelist page.
func TestFreelist_read(t *testing.T) {
// Create a page.
Expand Down
16 changes: 8 additions & 8 deletions internal/freelist/hashmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,22 +21,22 @@ type hashMap struct {
}

func (f *hashMap) Init(pgids common.Pgids) {
// reset the counter when freelist init
f.freePagesCount = 0
f.freemaps = make(map[uint64]pidSet)
f.forwardMap = make(map[common.Pgid]uint64)
f.backwardMap = make(map[common.Pgid]uint64)

if len(pgids) == 0 {
return
}

size := uint64(1)
start := pgids[0]
// reset the counter when freelist init
f.freePagesCount = 0

if !sort.SliceIsSorted([]common.Pgid(pgids), func(i, j int) bool { return pgids[i] < pgids[j] }) {
panic("pgids not sorted")
}

f.freemaps = make(map[uint64]pidSet)
f.forwardMap = make(map[common.Pgid]uint64)
f.backwardMap = make(map[common.Pgid]uint64)
size := uint64(1)
start := pgids[0]

for i := 1; i < len(pgids); i++ {
// continuous page
Expand Down

0 comments on commit 8e104b4

Please sign in to comment.