jobwatch/app/state/lock.go

46 lines
904 B
Go

package state
import (
"fmt"
"log"
"os"
"path/filepath"
"time"
"github.com/nightlyone/lockfile"
)
const LOCk_WAIT_MILLIS = 30000
func Lock(jobFullName string, lockType string) (*lockfile.Lockfile, error) {
fn := fmt.Sprintf("%v_%v", jobFullName, lockType)
lock, err := lockfile.New(filepath.Join(os.TempDir(), fn))
if err != nil {
return nil, fmt.Errorf("Cannot init lock. reason: %v", err)
}
var retries = 300
for retries > 0 {
err = lock.TryLock()
if err == nil {
log.Printf("Locked via lockfile %v", lock)
return &lock, nil
}
if _, ok := err.(interface{ Temporary() bool }); ok {
retries--
time.Sleep(time.Millisecond * 100)
} else {
retries = -1
}
}
return nil, fmt.Errorf("Timeout acquiring lock %v/%v", jobFullName, lockType)
}
func Unlock(lock *lockfile.Lockfile) {
if lock != nil {
log.Printf("Unlock lockfile %v", *lock)
lock.Unlock()
}
}