From a1873dd6f65654d463455ae2d381c35c12f71f51 Mon Sep 17 00:00:00 2001 From: Ben Johnson Date: Thu, 15 May 2014 14:04:57 -0600 Subject: Add option to adjust fill percentage. This commit adds the ability to adjust the fill percentage for splitting nodes. This works by setting a threshold that is a percentage of a total page size. When that threshold is crossed during a split then a new node is created. This is primarily beneficial for append-only workloads. Fixes #163. --- db.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'db.go') diff --git a/db.go b/db.go index 758c911..5488334 100644 --- a/db.go +++ b/db.go @@ -24,6 +24,15 @@ const version = 2 // Represents a marker value to indicate that a file is a Bolt DB. const magic uint32 = 0xED0CDAED +const ( + minFillPercent = 0.1 + maxFillPercent = 1.0 +) + +// DefaultFillPercent is the percentage that split pages are filled. +// This value can be changed by setting DB.FillPercent. +const DefaultFillPercent = 0.5 + var ( // ErrDatabaseNotOpen is returned when a DB instance is accessed before it // is opened or after it is closed. @@ -54,6 +63,11 @@ type DB struct { // debugging purposes. StrictMode bool + // Sets the threshold for filling pages when they split. By default, + // the database will fill to 50% but it can be useful to increase this + // amount if you know that your write workloads are typically append-only. + FillPercent float64 + path string file *os.File data []byte @@ -94,7 +108,7 @@ func (db *DB) String() string { // Open creates and opens a database at the given path. // If the file does not exist then it will be created automatically. func Open(path string, mode os.FileMode) (*DB, error) { - var db = &DB{opened: true} + var db = &DB{opened: true, FillPercent: DefaultFillPercent} // Open data file and separate sync handler for metadata writes. db.path = path -- cgit v1.2.3