|
|
|
@ -68,20 +68,32 @@ func Lock(name string, duration time.Duration, owner string) (bool, time.Time) {
|
|
|
|
|
func Unlock(name, owner string) {
|
|
|
|
|
pruneLocks()
|
|
|
|
|
|
|
|
|
|
t := cayley.NewTransaction()
|
|
|
|
|
unlocked := 0
|
|
|
|
|
it, _ := cayley.StartPath(store, name).Has("locked", "locked").Has("locked_by", owner).Save("locked_until", "locked_until").BuildIterator().Optimize()
|
|
|
|
|
defer it.Close()
|
|
|
|
|
|
|
|
|
|
for cayley.RawNext(it) {
|
|
|
|
|
tags := make(map[string]graph.Value)
|
|
|
|
|
it.TagResults(tags)
|
|
|
|
|
|
|
|
|
|
t := cayley.NewTransaction()
|
|
|
|
|
t.RemoveQuad(cayley.Quad(name, "locked", "locked", ""))
|
|
|
|
|
t.RemoveQuad(cayley.Quad(name, "locked_until", store.NameOf(tags["locked_until"]), ""))
|
|
|
|
|
t.RemoveQuad(cayley.Quad(name, "locked_by", owner, ""))
|
|
|
|
|
}
|
|
|
|
|
err := store.ApplyTransaction(t)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorf("failed transaction (Unlock): %s", err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
store.ApplyTransaction(t)
|
|
|
|
|
unlocked++
|
|
|
|
|
}
|
|
|
|
|
if it.Err() != nil {
|
|
|
|
|
log.Errorf("failed query in Unlock: %s", it.Err())
|
|
|
|
|
}
|
|
|
|
|
if unlocked > 1 {
|
|
|
|
|
// We should never see this, it would mean that our database doesn't ensure quad uniqueness
|
|
|
|
|
// and that the entire lock system is jeopardized.
|
|
|
|
|
log.Errorf("found inconsistency in Unlock: matched %d times a locked named: %s", unlocked, name)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// LockInfo returns the owner of a lock specified by its name and its
|
|
|
|
@ -109,7 +121,6 @@ func pruneLocks() {
|
|
|
|
|
now := time.Now()
|
|
|
|
|
|
|
|
|
|
// Delete every expired locks
|
|
|
|
|
tr := cayley.NewTransaction()
|
|
|
|
|
it, _ := cayley.StartPath(store, "locked").In("locked").Save("locked_until", "locked_until").Save("locked_by", "locked_by").BuildIterator().Optimize()
|
|
|
|
|
defer it.Close()
|
|
|
|
|
for cayley.RawNext(it) {
|
|
|
|
@ -123,12 +134,20 @@ func pruneLocks() {
|
|
|
|
|
|
|
|
|
|
if now.Unix() > tt {
|
|
|
|
|
log.Debugf("Lock %s owned by %s has expired.", n, o)
|
|
|
|
|
|
|
|
|
|
tr := cayley.NewTransaction()
|
|
|
|
|
tr.RemoveQuad(cayley.Quad(n, "locked", "locked", ""))
|
|
|
|
|
tr.RemoveQuad(cayley.Quad(n, "locked_until", t, ""))
|
|
|
|
|
tr.RemoveQuad(cayley.Quad(n, "locked_by", o, ""))
|
|
|
|
|
err := store.ApplyTransaction(tr)
|
|
|
|
|
if err != nil {
|
|
|
|
|
log.Errorf("failed transaction (pruneLocks): %s", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
store.ApplyTransaction(tr)
|
|
|
|
|
if it.Err() != nil {
|
|
|
|
|
log.Errorf("failed query in Unlock: %s", it.Err())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// getLockedNodes returns every nodes that are currently locked
|
|
|
|
|