mirror of https://github.com/etcd-io/bbolt.git
merge inline branch into leaf branch
parent
deffc06a05
commit
0dbfa3f08a
19
bucket.go
19
bucket.go
|
@ -369,21 +369,17 @@ func (b *Bucket) Stats() BucketStats {
|
||||||
s.InlineBucketN += 1
|
s.InlineBucketN += 1
|
||||||
}
|
}
|
||||||
b.forEachPage(func(p *page, depth int) {
|
b.forEachPage(func(p *page, depth int) {
|
||||||
if b.root == 0 { // inline bucket
|
if (p.flags & leafPageFlag) != 0 {
|
||||||
s.KeyN += int(p.count)
|
s.KeyN += int(p.count)
|
||||||
|
used := pageHeaderSize + (leafPageElementSize * int(p.count))
|
||||||
|
if p.count != 0 {
|
||||||
lastElement := p.leafPageElement(p.count - 1)
|
lastElement := p.leafPageElement(p.count - 1)
|
||||||
used := bucketHeaderSize + pageHeaderSize + (leafPageElementSize * int(p.count-1))
|
|
||||||
used += int(lastElement.pos + lastElement.ksize + lastElement.vsize)
|
used += int(lastElement.pos + lastElement.ksize + lastElement.vsize)
|
||||||
s.InlineBucketInuse += used
|
|
||||||
} else if (p.flags & leafPageFlag) != 0 {
|
|
||||||
s.LeafPageN++
|
|
||||||
if p.count == 0 {
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
s.KeyN += int(p.count)
|
if b.root == 0 {
|
||||||
lastElement := p.leafPageElement(p.count - 1)
|
s.InlineBucketInuse += used
|
||||||
used := pageHeaderSize + (leafPageElementSize * int(p.count-1))
|
} else {
|
||||||
used += int(lastElement.pos + lastElement.ksize + lastElement.vsize)
|
s.LeafPageN++
|
||||||
s.LeafInuse += used
|
s.LeafInuse += used
|
||||||
s.LeafOverflowN += int(p.overflow)
|
s.LeafOverflowN += int(p.overflow)
|
||||||
|
|
||||||
|
@ -394,6 +390,7 @@ func (b *Bucket) Stats() BucketStats {
|
||||||
subStats.Add(b.openBucket(e.value()).Stats())
|
subStats.Add(b.openBucket(e.value()).Stats())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else if (p.flags & branchPageFlag) != 0 {
|
} else if (p.flags & branchPageFlag) != 0 {
|
||||||
s.BranchPageN++
|
s.BranchPageN++
|
||||||
lastElement := p.branchPageElement(p.count - 1)
|
lastElement := p.branchPageElement(p.count - 1)
|
||||||
|
|
|
@ -583,7 +583,7 @@ func TestBucket_Stats(t *testing.T) {
|
||||||
assert.Equal(t, 501, stats.KeyN, "KeyN")
|
assert.Equal(t, 501, stats.KeyN, "KeyN")
|
||||||
assert.Equal(t, 2, stats.Depth, "Depth")
|
assert.Equal(t, 2, stats.Depth, "Depth")
|
||||||
assert.Equal(t, 125, stats.BranchInuse, "BranchInuse")
|
assert.Equal(t, 125, stats.BranchInuse, "BranchInuse")
|
||||||
assert.Equal(t, 20908, stats.LeafInuse, "LeafInuse")
|
assert.Equal(t, 21004, stats.LeafInuse, "LeafInuse")
|
||||||
if os.Getpagesize() == 4096 {
|
if os.Getpagesize() == 4096 {
|
||||||
// Incompatible page size
|
// Incompatible page size
|
||||||
assert.Equal(t, 4096, stats.BranchAlloc, "BranchAlloc")
|
assert.Equal(t, 4096, stats.BranchAlloc, "BranchAlloc")
|
||||||
|
@ -634,6 +634,40 @@ func TestBucket_Stats_Small(t *testing.T) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBucket_Stats_EmptyBucket(t *testing.T) {
|
||||||
|
|
||||||
|
withOpenDB(func(db *DB, path string) {
|
||||||
|
db.Update(func(tx *Tx) error {
|
||||||
|
// Add a bucket that fits on a single root leaf.
|
||||||
|
_, err := tx.CreateBucket([]byte("whozawhats"))
|
||||||
|
assert.NoError(t, err)
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
mustCheck(db)
|
||||||
|
db.View(func(tx *Tx) error {
|
||||||
|
b := tx.Bucket([]byte("whozawhats"))
|
||||||
|
stats := b.Stats()
|
||||||
|
assert.Equal(t, 0, stats.BranchPageN, "BranchPageN")
|
||||||
|
assert.Equal(t, 0, stats.BranchOverflowN, "BranchOverflowN")
|
||||||
|
assert.Equal(t, 0, stats.LeafPageN, "LeafPageN")
|
||||||
|
assert.Equal(t, 0, stats.LeafOverflowN, "LeafOverflowN")
|
||||||
|
assert.Equal(t, 0, stats.KeyN, "KeyN")
|
||||||
|
assert.Equal(t, 1, stats.Depth, "Depth")
|
||||||
|
assert.Equal(t, 0, stats.BranchInuse, "BranchInuse")
|
||||||
|
assert.Equal(t, 0, stats.LeafInuse, "LeafInuse")
|
||||||
|
if os.Getpagesize() == 4096 {
|
||||||
|
// Incompatible page size
|
||||||
|
assert.Equal(t, 0, stats.BranchAlloc, "BranchAlloc")
|
||||||
|
assert.Equal(t, 0, stats.LeafAlloc, "LeafAlloc")
|
||||||
|
}
|
||||||
|
assert.Equal(t, 1, stats.BucketN, "BucketN")
|
||||||
|
assert.Equal(t, 1, stats.InlineBucketN, "InlineBucketN")
|
||||||
|
assert.Equal(t, pageHeaderSize, stats.InlineBucketInuse, "InlineBucketInuse")
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// Ensure a bucket can calculate stats.
|
// Ensure a bucket can calculate stats.
|
||||||
func TestBucket_Stats_Nested(t *testing.T) {
|
func TestBucket_Stats_Nested(t *testing.T) {
|
||||||
|
|
||||||
|
@ -667,7 +701,7 @@ func TestBucket_Stats_Nested(t *testing.T) {
|
||||||
assert.Equal(t, 122, stats.KeyN, "KeyN")
|
assert.Equal(t, 122, stats.KeyN, "KeyN")
|
||||||
assert.Equal(t, 3, stats.Depth, "Depth")
|
assert.Equal(t, 3, stats.Depth, "Depth")
|
||||||
assert.Equal(t, 0, stats.BranchInuse, "BranchInuse")
|
assert.Equal(t, 0, stats.BranchInuse, "BranchInuse")
|
||||||
assert.Equal(t, 2474, stats.LeafInuse, "LeafInuse")
|
assert.Equal(t, 2506, stats.LeafInuse, "LeafInuse")
|
||||||
if os.Getpagesize() == 4096 {
|
if os.Getpagesize() == 4096 {
|
||||||
// Incompatible page size
|
// Incompatible page size
|
||||||
assert.Equal(t, 0, stats.BranchAlloc, "BranchAlloc")
|
assert.Equal(t, 0, stats.BranchAlloc, "BranchAlloc")
|
||||||
|
@ -712,7 +746,7 @@ func TestBucket_Stats_Large(t *testing.T) {
|
||||||
assert.Equal(t, 100000, stats.KeyN, "KeyN")
|
assert.Equal(t, 100000, stats.KeyN, "KeyN")
|
||||||
assert.Equal(t, 3, stats.Depth, "Depth")
|
assert.Equal(t, 3, stats.Depth, "Depth")
|
||||||
assert.Equal(t, 27007, stats.BranchInuse, "BranchInuse")
|
assert.Equal(t, 27007, stats.BranchInuse, "BranchInuse")
|
||||||
assert.Equal(t, 2598436, stats.LeafInuse, "LeafInuse")
|
assert.Equal(t, 2619092, stats.LeafInuse, "LeafInuse")
|
||||||
if os.Getpagesize() == 4096 {
|
if os.Getpagesize() == 4096 {
|
||||||
// Incompatible page size
|
// Incompatible page size
|
||||||
assert.Equal(t, 77824, stats.BranchAlloc, "BranchAlloc")
|
assert.Equal(t, 77824, stats.BranchAlloc, "BranchAlloc")
|
||||||
|
|
Loading…
Reference in New Issue