diff --git a/file.go b/file.go index 71bd0f8..e685628 100644 --- a/file.go +++ b/file.go @@ -105,7 +105,6 @@ func (f *fileStore) getDB(database, table string) (*fileHandle, error) { } k := key(database, table) - f.RLock() fd, ok := f.handles[k] f.RUnlock() @@ -115,6 +114,13 @@ func (f *fileStore) getDB(database, table string) (*fileHandle, error) { return fd, nil } + // double check locking + f.Lock() + defer f.Unlock() + if fd, ok := f.handles[k]; ok { + return fd, nil + } + // create a directory /tmp/micro dir := filepath.Join(DefaultDir, database) // create the database handle @@ -125,18 +131,16 @@ func (f *fileStore) getDB(database, table string) (*fileHandle, error) { dbPath := filepath.Join(dir, fname) // create new db handle + // Bolt DB only allows one process to open the file R/W so make sure we're doing this under a lock db, err := bolt.Open(dbPath, 0700, &bolt.Options{Timeout: 5 * time.Second}) if err != nil { return nil, err } - - f.Lock() fd = &fileHandle{ key: k, db: db, } f.handles[k] = fd - f.Unlock() return fd, nil }