aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Kobetic <mkobetic@gmail.com>2014-06-17 18:40:56 +0000
committerMartin Kobetic <mkobetic@gmail.com>2014-06-17 18:40:56 +0000
commitc105316292b7aef09c1eb260fb5f5c8f9f07ec3f (patch)
tree9b98a0d246e36d43c33507dbdcf37634a79a2f04
parentDocument key/value lifecycle. (diff)
downloaddedo-c105316292b7aef09c1eb260fb5f5c8f9f07ec3f.tar.gz
dedo-c105316292b7aef09c1eb260fb5f5c8f9f07ec3f.tar.xz
add freelist stats to db stats
-rw-r--r--db.go22
-rw-r--r--db_test.go3
-rw-r--r--freelist.go11
-rw-r--r--tx.go4
4 files changed, 29 insertions, 11 deletions
diff --git a/db.go b/db.go
index 0b4631f..f58da8c 100644
--- a/db.go
+++ b/db.go
@@ -427,16 +427,12 @@ func (db *DB) removeTx(tx *Tx) {
break
}
}
- n := len(db.txs)
// Unlock the meta pages.
db.metalock.Unlock()
// Merge statistics.
- db.statlock.Lock()
- db.stats.OpenTxN = n
- db.stats.TxStats.add(&tx.stats)
- db.statlock.Unlock()
+ db.mergeStats(&tx.stats)
}
// Update executes a function within the context of a read-write managed transaction.
@@ -554,10 +550,24 @@ func (db *DB) allocate(count int) (*page, error) {
return p, nil
}
+// mergeStats updates db stats in thread-safe manner.
+func (db *DB) mergeStats(txStats *TxStats) {
+ db.statlock.Lock()
+ db.stats.FreelistN = db.freelist.count()
+ db.stats.FreelistAlloc = db.freelist.size()
+ db.stats.OpenTxN = len(db.txs)
+ db.stats.TxStats.add(txStats)
+ db.statlock.Unlock()
+}
+
// 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..5cb99e0 100644
--- a/tx.go
+++ b/tx.go
@@ -236,9 +236,7 @@ func (tx *Tx) close() {
tx.db.rwlock.Unlock()
// Merge statistics.
- tx.db.statlock.Lock()
- tx.db.stats.TxStats.add(&tx.stats)
- tx.db.statlock.Unlock()
+ tx.db.mergeStats(&tx.stats)
} else {
tx.db.removeTx(tx)
}