diff options
author | Ben Johnson <benbjohnson@yahoo.com> | 2015-12-30 08:33:30 -0700 |
---|---|---|
committer | Ben Johnson <benbjohnson@yahoo.com> | 2015-12-30 08:33:30 -0700 |
commit | 343cdc2b4e5e6e15d6076f7144e26eab454cfe3b (patch) | |
tree | a88f0fb9f747a01a256e9dc33b8f7a99bd78a789 /db.go | |
parent | Merge pull request #470 from ReadmeCritic/master (diff) | |
parent | Introduce InitialMmapSize to prevent deadlock (diff) | |
download | dedo-343cdc2b4e5e6e15d6076f7144e26eab454cfe3b.tar.gz dedo-343cdc2b4e5e6e15d6076f7144e26eab454cfe3b.tar.xz |
Merge pull request #472 from gyuho/initial_mmap
Introduce InitialMmapSize to prevent deadlock
Diffstat (limited to 'db.go')
-rw-r--r-- | db.go | 16 |
1 files changed, 15 insertions, 1 deletions
@@ -196,7 +196,7 @@ func Open(path string, mode os.FileMode, options *Options) (*DB, error) { } // Memory map the data file. - if err := db.mmap(0); err != nil { + if err := db.mmap(options.InitialMmapSize); err != nil { _ = db.close() return nil, err } @@ -411,6 +411,10 @@ func (db *DB) close() error { // writer to deadlock because the database periodically needs to re-mmap itself // as it grows and it cannot do that while a read transaction is open. // +// If a long running read transaction (for example, a snapshot transaction) is +// needed, you might want to set DB.InitialMmapSize to a large enough value +// to avoid potential blocking of write transaction. +// // IMPORTANT: You must close read-only transactions after you are finished or // else the database will not reclaim old pages. func (db *DB) Begin(writable bool) (*Tx, error) { @@ -680,6 +684,16 @@ type Options struct { // Sets the DB.MmapFlags flag before memory mapping the file. MmapFlags int + + // InitialMmapSize is the initial mmap size of the database + // in bytes. Read transactions won't block write transaction + // if the InitialMmapSize is large enough to hold database mmap + // size. (See DB.Begin for more information) + // + // If <=0, the initial map size is 0. + // If initialMmapSize is smaller than the previous database size, + // it takes no effect. + InitialMmapSize int } // DefaultOptions represent the options used if nil options are passed into Open(). |