index/kvfile: use new Locker hook in kv to use osutil's Lock func

Change-Id: I7573ea79f5f99ef1b7fe03bd9270b61940339a56
This commit is contained in:
Brad Fitzpatrick 2013-08-25 12:56:36 -05:00
parent 6a8f653ef0
commit 87451bb5bd
1 changed files with 7 additions and 26 deletions
pkg/index/kvfile

View File

@ -38,42 +38,23 @@ func init() {
} }
func NewStorage(file string) (index.Storage, io.Closer, error) { func NewStorage(file string) (index.Storage, io.Closer, error) {
lk, err := osutil.Lock(file + ".lock")
if err != nil {
return nil, nil, err
}
createOpen := kv.Open createOpen := kv.Open
if _, err := os.Stat(file); os.IsNotExist(err) { if _, err := os.Stat(file); os.IsNotExist(err) {
createOpen = kv.Create createOpen = kv.Create
} }
db, err := createOpen(file, &kv.Options{}) db, err := createOpen(file, &kv.Options{
Locker: func(dbname string) (io.Closer, error) {
lkfile := dbname + ".lock"
return osutil.Lock(lkfile)
},
})
if err != nil { if err != nil {
lk.Close()
return nil, nil, err return nil, nil, err
} }
closer := &closerFunc{fn: func() error {
defer lk.Close()
return db.Close()
}}
is := &kvis{ is := &kvis{
db: db, db: db,
} }
return is, closer, nil return is, struct{ io.Closer }{db}, nil
}
type closerFunc struct {
once sync.Once
err error
fn func() error
}
func (c *closerFunc) Close() error {
c.once.Do(c.close)
return c.err
}
func (c *closerFunc) close() {
c.err = c.fn()
} }
type kvis struct { type kvis struct {