defer release the lock
parent
fb24d04fef
commit
9fad24aa37
|
|
@ -28,30 +28,34 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// WriteWithLock decorates ioutil.WriteFile with a file lock and retry
|
// WriteWithLock decorates ioutil.WriteFile with a file lock and retry
|
||||||
func WriteFile(filename string, data []byte, perm os.FileMode) error {
|
func WriteFile(filename string, data []byte, perm os.FileMode) (err error) {
|
||||||
lock := fslock.New(filename)
|
lock := fslock.New(filename)
|
||||||
|
glog.Infof("attempting to write to file %q with filemode %v", filename, perm)
|
||||||
|
|
||||||
getLock := func() error {
|
getLock := func() error {
|
||||||
lockErr := lock.TryLock()
|
lockErr := lock.TryLock()
|
||||||
if lockErr != nil {
|
if lockErr != nil {
|
||||||
glog.Infof("temproary error : %v", lockErr.Error())
|
glog.Warningf("temporary error : %v", lockErr.Error())
|
||||||
return errors.Wrapf(lockErr, "falied to acquire file lock for %s > ", filename)
|
return errors.Wrapf(lockErr, "falied to acquire lock for %s > ", filename)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
err := retry.Expo(getLock, 500*time.Millisecond, 13*time.Second)
|
|
||||||
|
defer func() { // release the lock
|
||||||
|
err = lock.Unlock()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "acquiring file lock for %s", filename)
|
err = errors.Wrapf(err, "error releasing lock for file: %s", filename)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
err = retry.Expo(getLock, 500*time.Millisecond, 13*time.Second)
|
||||||
|
if err != nil {
|
||||||
|
return errors.Wrapf(err, "error acquiring lock for %s", filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := ioutil.WriteFile(filename, data, perm); err != nil {
|
if err = ioutil.WriteFile(filename, data, perm); err != nil {
|
||||||
return errors.Wrapf(err, "error writing file %s", filename)
|
return errors.Wrapf(err, "error writing file %s", filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
// release the lock
|
return err
|
||||||
err = lock.Unlock()
|
|
||||||
if err != nil {
|
|
||||||
return errors.Wrapf(err, "error releasing lock for file: %s", filename)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue