diff options
author | Ben Johnson <benbjohnson@yahoo.com> | 2016-01-11 14:47:01 -0700 |
---|---|---|
committer | Ben Johnson <benbjohnson@yahoo.com> | 2016-01-11 14:47:01 -0700 |
commit | 694a82a9595845d376dd19ff5c24cab78801204b (patch) | |
tree | 19c30005f6e3c46c78eb582e9f28f8af81d24d10 /db.go | |
parent | Merge pull request #479 from azazeal/master (diff) | |
parent | do not grow dbsize agressively (diff) | |
download | dedo-694a82a9595845d376dd19ff5c24cab78801204b.tar.gz dedo-694a82a9595845d376dd19ff5c24cab78801204b.tar.xz |
Merge branch 'grow' of https://github.com/xiang90/bolt into xiang90-grow
Diffstat (limited to 'db.go')
-rw-r--r-- | db.go | 32 |
1 files changed, 32 insertions, 0 deletions
@@ -90,6 +90,7 @@ type DB struct { dataref []byte // mmap'ed readonly, write throws SEGV data *[maxMapSize]byte datasz int + filesz int // current on disk file size meta0 *meta meta1 *meta pageSize int @@ -798,6 +799,37 @@ func (db *DB) allocate(count int) (*page, error) { return p, nil } +// growSize grows the size of the database to the given sz. +func (db *DB) growSize(sz int) error { + if sz <= db.filesz { + return nil + } + + // over allocate 16MB to avoid calling Truncate aggressively + // for efficiency + overAllocation := 16 * 1024 * 1024 + sz = sz + overAllocation + + // do not over allocate + if sz > db.datasz { + sz = db.datasz + } + + // Truncate and fsync to ensure file size metadata is flushed. + // https://github.com/boltdb/bolt/issues/284 + if !db.NoGrowSync && !db.readOnly { + if err := db.file.Truncate(int64(sz)); err != nil { + return fmt.Errorf("file resize error: %s", err) + } + if err := db.file.Sync(); err != nil { + return fmt.Errorf("file sync error: %s", err) + } + } + + db.filesz = sz + return nil +} + func (db *DB) IsReadOnly() bool { return db.readOnly } |