diff options
author | Xiang Li <xiangli.cs@gmail.com> | 2015-11-04 15:12:18 -0800 |
---|---|---|
committer | Xiang Li <xiangli.cs@gmail.com> | 2015-11-06 09:39:17 -0800 |
commit | e67705ed6348675b7bae405ebeb37bb69b53a96d (patch) | |
tree | 896094dfe1466aa5a017424ee19a434dbf9f35cb /tx.go | |
parent | Merge pull request #428 from lukechampine/patch-1 (diff) | |
download | dedo-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.go | 6 |
1 files changed, 6 insertions, 0 deletions
@@ -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 { |