46 lines
904 B
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()
|
|
}
|
|
}
|