Merge pull request #111 from benbjohnson/flock

Add advisory file locking.
master
Ben Johnson 2014-04-02 14:09:28 -06:00
commit c5823a20bd
1 changed files with 12 additions and 0 deletions

12
db.go
View File

@ -79,6 +79,14 @@ func Open(path string, mode os.FileMode) (*DB, error) {
return nil, err
}
// Lock file so that other processes using Bolt cannot use the database
// at the same time. This would cause corruption since the two processes
// would write meta pages and free pages separately.
if err := syscall.Flock(int(db.file.Fd()), syscall.LOCK_EX); err != nil {
_ = db.close()
return nil, err
}
// Default values for test hooks
db.ops.writeAt = db.file.WriteAt
@ -267,6 +275,10 @@ func (db *DB) close() error {
// Close file handles.
if db.file != nil {
// Unlock the file.
_ = syscall.Flock(int(db.file.Fd()), syscall.LOCK_UN)
// Close the file descriptor.
if err := db.file.Close(); err != nil {
return fmt.Errorf("db file close: %s", err)
}