diff --git a/db.go b/db.go index 0b4631f..13bfb16 100644 --- a/db.go +++ b/db.go @@ -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. diff --git a/db_test.go b/db_test.go index 9fd4662..8e9f399 100644 --- a/db_test.go +++ b/db_test.go @@ -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()) }) } diff --git a/freelist.go b/freelist.go index e27f80a..3551113 100644 --- a/freelist.go +++ b/freelist.go @@ -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. diff --git a/tx.go b/tx.go index 9ab1178..bcbcd5f 100644 --- a/tx.go +++ b/tx.go @@ -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 {