aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Kobetic <mkobetic@gmail.com>2014-04-22 18:22:42 +0000
committerMartin Kobetic <mkobetic@gmail.com>2014-04-22 18:22:42 +0000
commit382ccc27461413f8e47d4db3016f8a1a20aa0617 (patch)
treebbc3508c6db682b87413f955fbd8941056b5cb2f
parentMerge pull request #134 from Shopify/c_cursor (diff)
downloaddedo-382ccc27461413f8e47d4db3016f8a1a20aa0617.tar.gz
dedo-382ccc27461413f8e47d4db3016f8a1a20aa0617.tar.xz
add Used/Free Leaf/Branch bucket stats
-rw-r--r--bucket.go15
1 files changed, 15 insertions, 0 deletions
diff --git a/bucket.go b/bucket.go
index 77d31c9..5f78710 100644
--- a/bucket.go
+++ b/bucket.go
@@ -331,12 +331,23 @@ func (b *Bucket) ForEach(fn func(k, v []byte) error) error {
// Stat returns stats on a bucket.
func (b *Bucket) Stat() *BucketStat {
s := &BucketStat{}
+ pageSize := b.Tx().DB().Info().PageSize
b.tx.forEachPage(b.root, 0, func(p *page, depth int) {
if (p.flags & leafPageFlag) != 0 {
s.LeafPageCount++
s.KeyCount += int(p.count)
+ lastElement := p.leafPageElement(p.count - 1)
+ used := pageHeaderSize + (leafPageElementSize * int(p.count-1))
+ used += int(lastElement.pos + lastElement.ksize + lastElement.vsize)
+ s.UsedLeafSpace += used
+ s.FreeLeafSpace += int(p.overflow+1)*pageSize - used
} else if (p.flags & branchPageFlag) != 0 {
s.BranchPageCount++
+ lastElement := p.branchPageElement(p.count - 1)
+ used := pageHeaderSize + (branchPageElementSize * int(p.count-1))
+ used += int(lastElement.pos + lastElement.ksize)
+ s.UsedBranchSpace += used
+ s.FreeBranchSpace += int(p.overflow+1)*pageSize - used
}
s.OverflowPageCount += int(p.overflow)
@@ -511,4 +522,8 @@ type BucketStat struct {
OverflowPageCount int
KeyCount int
MaxDepth int
+ UsedBranchSpace int
+ FreeBranchSpace int
+ UsedLeafSpace int
+ FreeLeafSpace int
}