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() } }