Merge pull request #286 from benbjohnson/trunc-n-sync

Add truncate() and sync() on resize.
master
Ben Johnson 2015-01-18 07:49:58 -08:00
commit 4397537d1d
1 changed files with 11 additions and 0 deletions

View File

@ -3,6 +3,7 @@
package bolt package bolt
import ( import (
"fmt"
"os" "os"
"syscall" "syscall"
"time" "time"
@ -41,6 +42,16 @@ func funlock(f *os.File) error {
// mmap memory maps a DB's data file. // mmap memory maps a DB's data file.
func mmap(db *DB, sz int) error { func mmap(db *DB, sz int) error {
// Truncate and fsync to ensure file size metadata is flushed.
// https://github.com/boltdb/bolt/issues/284
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)
}
// Map the data file to memory.
b, err := syscall.Mmap(int(db.file.Fd()), 0, sz, syscall.PROT_READ, syscall.MAP_SHARED) b, err := syscall.Mmap(int(db.file.Fd()), 0, sz, syscall.PROT_READ, syscall.MAP_SHARED)
if err != nil { if err != nil {
return err return err