summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--db.go6
-rw-r--r--db_test.go3
-rw-r--r--freelist.go11
-rw-r--r--tx.go6
4 files changed, 23 insertions, 3 deletions
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 {