aboutsummaryrefslogtreecommitdiff
path: root/tx.go
diff options
context:
space:
mode:
authorXiang Li <xiangli.cs@gmail.com>2015-11-04 15:12:18 -0800
committerXiang Li <xiangli.cs@gmail.com>2015-11-06 09:39:17 -0800
commite67705ed6348675b7bae405ebeb37bb69b53a96d (patch)
tree896094dfe1466aa5a017424ee19a434dbf9f35cb /tx.go
parentMerge pull request #428 from lukechampine/patch-1 (diff)
downloaddedo-e67705ed6348675b7bae405ebeb37bb69b53a96d.tar.gz
dedo-e67705ed6348675b7bae405ebeb37bb69b53a96d.tar.xz
do not grow dbsize agressively
Only grow the database size when the high watermark increases. We also grows the database size a little bit aggressively to save a few ftruncates. I have tested this on various environments. The performance impact is ignorable with 16MB over allocation. Without over allocation, the performance might decrease 100% when each Tx.Commit needs a new page on a very slow disk (seek time dominates the total write).
Diffstat (limited to 'tx.go')
-rw-r--r--tx.go6
1 files changed, 6 insertions, 0 deletions
diff --git a/tx.go b/tx.go
index cb60149..80d9799 100644
--- a/tx.go
+++ b/tx.go
@@ -157,6 +157,8 @@ func (tx *Tx) Commit() error {
// Free the old root bucket.
tx.meta.root.root = tx.root.root
+ opgid := tx.meta.pgid
+
// Free the freelist and allocate new pages for it. This will overestimate
// the size of the freelist but not underestimate the size (which would be bad).
tx.db.freelist.free(tx.meta.txid, tx.db.page(tx.meta.freelist))
@@ -171,6 +173,10 @@ func (tx *Tx) Commit() error {
}
tx.meta.freelist = p.id
+ if tx.meta.pgid > opgid {
+ tx.db.growSize(int(tx.meta.pgid+1) * tx.db.pageSize)
+ }
+
// Write dirty pages to disk.
startTime = time.Now()
if err := tx.write(); err != nil {