From f0ad07c7d4a23e9a4a27fc9138cde5856cb04ee9 Mon Sep 17 00:00:00 2001 From: Xingyu Chen Date: Mon, 21 Jan 2019 15:42:17 +0800 Subject: [PATCH] add getFreePageIDs (#140) --- db.go | 2 +- freelist.go | 12 ++++++++---- freelist_test.go | 28 ++++++++++++++-------------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/db.go b/db.go index d91dcf8..a72fad5 100644 --- a/db.go +++ b/db.go @@ -291,7 +291,7 @@ func (db *DB) loadFreelist() { // Read free list from freelist page. db.freelist.read(db.page(db.meta().freelist)) } - db.stats.FreePageN = len(db.freelist.ids) + db.stats.FreePageN = len(db.freelist.getFreePageIDs()) }) } diff --git a/freelist.go b/freelist.go index c3c25e7..0d080c6 100644 --- a/freelist.go +++ b/freelist.go @@ -69,7 +69,7 @@ func (f *freelist) copyall(dst []pgid) { m = append(m, txp.ids...) } sort.Sort(m) - mergepgids(dst, f.ids, m) + mergepgids(dst, f.getFreePageIDs(), m) } // allocate returns the starting page id of a contiguous list of pages of a given size. @@ -266,6 +266,10 @@ func (f *freelist) readIDs(ids []pgid) { f.reindex() } +func (f *freelist) getFreePageIDs() []pgid { + return f.ids +} + // write writes the page ids onto a freelist page. All free and pending ids are // saved to disk since in the event of a program crash, all pending ids will // become free. @@ -307,7 +311,7 @@ func (f *freelist) reload(p *page) { // Check each page in the freelist and build a new available freelist // with any pages not in the pending lists. var a []pgid - for _, id := range f.ids { + for _, id := range f.getFreePageIDs() { if !pcache[id] { a = append(a, id) } @@ -318,8 +322,8 @@ func (f *freelist) reload(p *page) { // reindex rebuilds the free cache based on available and pending free lists. func (f *freelist) reindex() { - f.cache = make(map[pgid]bool, len(f.ids)) - for _, id := range f.ids { + f.cache = make(map[pgid]bool, len(f.getFreePageIDs())) + for _, id := range f.getFreePageIDs() { f.cache[id] = true } for _, txp := range f.pending { diff --git a/freelist_test.go b/freelist_test.go index 8478777..04fea96 100644 --- a/freelist_test.go +++ b/freelist_test.go @@ -34,13 +34,13 @@ func TestFreelist_release(t *testing.T) { f.free(102, &page{id: 39}) f.release(100) f.release(101) - if exp := []pgid{9, 12, 13}; !reflect.DeepEqual(exp, f.ids) { - t.Fatalf("exp=%v; got=%v", exp, f.ids) + if exp := []pgid{9, 12, 13}; !reflect.DeepEqual(exp, f.getFreePageIDs()) { + t.Fatalf("exp=%v; got=%v", exp, f.getFreePageIDs()) } f.release(102) - if exp := []pgid{9, 12, 13, 39}; !reflect.DeepEqual(exp, f.ids) { - t.Fatalf("exp=%v; got=%v", exp, f.ids) + if exp := []pgid{9, 12, 13, 39}; !reflect.DeepEqual(exp, f.getFreePageIDs()) { + t.Fatalf("exp=%v; got=%v", exp, f.getFreePageIDs()) } } @@ -167,8 +167,8 @@ func TestFreelist_releaseRange(t *testing.T) { f.releaseRange(r.begin, r.end) } - if exp := c.wantFree; !reflect.DeepEqual(exp, f.ids) { - t.Errorf("exp=%v; got=%v for %s", exp, f.ids, c.title) + if exp := c.wantFree; !reflect.DeepEqual(exp, f.getFreePageIDs()) { + t.Errorf("exp=%v; got=%v for %s", exp, f.getFreePageIDs(), c.title) } } } @@ -199,8 +199,8 @@ func TestFreelist_allocate(t *testing.T) { if id := int(f.allocate(1, 0)); id != 0 { t.Fatalf("exp=0; got=%v", id) } - if exp := []pgid{9, 18}; !reflect.DeepEqual(exp, f.ids) { - t.Fatalf("exp=%v; got=%v", exp, f.ids) + if exp := []pgid{9, 18}; !reflect.DeepEqual(exp, f.getFreePageIDs()) { + t.Fatalf("exp=%v; got=%v", exp, f.getFreePageIDs()) } if id := int(f.allocate(1, 1)); id != 9 { @@ -212,8 +212,8 @@ func TestFreelist_allocate(t *testing.T) { if id := int(f.allocate(1, 1)); id != 0 { t.Fatalf("exp=0; got=%v", id) } - if exp := []pgid{}; !reflect.DeepEqual(exp, f.ids) { - t.Fatalf("exp=%v; got=%v", exp, f.ids) + if exp := []pgid{}; !reflect.DeepEqual(exp, f.getFreePageIDs()) { + t.Fatalf("exp=%v; got=%v", exp, f.getFreePageIDs()) } } @@ -235,8 +235,8 @@ func TestFreelist_read(t *testing.T) { f.read(page) // Ensure that there are two page ids in the freelist. - if exp := []pgid{23, 50}; !reflect.DeepEqual(exp, f.ids) { - t.Fatalf("exp=%v; got=%v", exp, f.ids) + if exp := []pgid{23, 50}; !reflect.DeepEqual(exp, f.getFreePageIDs()) { + t.Fatalf("exp=%v; got=%v", exp, f.getFreePageIDs()) } } @@ -258,8 +258,8 @@ func TestFreelist_write(t *testing.T) { // Ensure that the freelist is correct. // All pages should be present and in reverse order. - if exp := []pgid{3, 11, 12, 28, 39}; !reflect.DeepEqual(exp, f2.ids) { - t.Fatalf("exp=%v; got=%v", exp, f2.ids) + if exp := []pgid{3, 11, 12, 28, 39}; !reflect.DeepEqual(exp, f2.getFreePageIDs()) { + t.Fatalf("exp=%v; got=%v", exp, f2.getFreePageIDs()) } }