mirror of https://github.com/etcd-io/bbolt.git
add getFreePageIDs (#140)
parent
c5638469ec
commit
f0ad07c7d4
2
db.go
2
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())
|
||||
})
|
||||
}
|
||||
|
||||
|
|
12
freelist.go
12
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 {
|
||||
|
|
|
@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue