Merge pull request #197 from Shopify/freelist_stats

Add freelist stats to db stats
master
Ben Johnson 2014-06-17 13:34:15 -06:00
commit f8365b732e
4 changed files with 23 additions and 3 deletions

6
db.go
View File

@ -556,8 +556,12 @@ func (db *DB) allocate(count int) (*page, error) {
// Stats represents statistics about the database.
type Stats struct {
// Freelist stats
FreelistN int // total number of pages on the freelist
FreelistAlloc int // total bytes used by the freelist and the pages on it
// Transaction stats
TxN int // total number of completed read transactions
TxN int // total number of started read transactions
OpenTxN int // number of currently open read transactions
TxStats TxStats // global, ongoing stats.

View File

@ -253,7 +253,8 @@ func TestDB_Stats(t *testing.T) {
return err
})
stats := db.Stats()
assert.Equal(t, 2, stats.TxStats.PageCount)
assert.Equal(t, 2, stats.TxStats.PageCount, "PageCount")
assert.Equal(t, 2, stats.FreelistN, "FreelistN %d", db.freelist.count())
})
}

View File

@ -22,7 +22,16 @@ type freelist struct {
// size returns the size of the page after serialization.
func (f *freelist) size() int {
return pageHeaderSize + (int(unsafe.Sizeof(pgid(0))) * len(f.all()))
return pageHeaderSize + (int(unsafe.Sizeof(pgid(0))) * f.count())
}
// count returns count of pages on the freelist
func (f *freelist) count() int {
var count = len(f.ids)
for _, list := range f.pending {
count += len(list)
}
return count
}
// all returns a list of all free ids and all pending ids in one sorted list.

6
tx.go
View File

@ -232,11 +232,17 @@ func (tx *Tx) rollback() {
func (tx *Tx) close() {
if tx.writable {
// Grab freelist stats.
var freelistN = tx.db.freelist.count()
var freelistAlloc = tx.db.freelist.size()
// Remove writer lock.
tx.db.rwlock.Unlock()
// Merge statistics.
tx.db.statlock.Lock()
tx.db.stats.FreelistN = freelistN
tx.db.stats.FreelistAlloc = freelistAlloc
tx.db.stats.TxStats.add(&tx.stats)
tx.db.statlock.Unlock()
} else {