Removed state argument from LockLockable and UnlockLockable

graph-rework-2
noah metz 2023-07-03 17:13:00 -06:00
parent 5bdc06bf0f
commit 4b64fb1ef2
3 changed files with 22 additions and 24 deletions

@ -364,7 +364,7 @@ func checkIfRequirement(ctx * GraphContext, r_id NodeID, cur LockableState, cur_
return false
}
func LockLockables(ctx * GraphContext, to_lock []Lockable, holder Lockable, holder_state LockableState, nodes NodeMap) error {
func LockLockables(ctx * GraphContext, to_lock []Lockable, holder Lockable , nodes NodeMap) error {
if to_lock == nil {
return fmt.Errorf("LOCKABLE_LOCK_ERR: no list provided")
}
@ -376,6 +376,7 @@ func LockLockables(ctx * GraphContext, to_lock []Lockable, holder Lockable, hold
if holder == nil {
return fmt.Errorf("LOCKABLE_LOCK_ERR: nil cannot hold locks")
}
holder_state := holder.State().(LockableState)
// Called with no requirements to lock, success
if len(to_lock) == 0 {
@ -428,7 +429,7 @@ func LockLockables(ctx * GraphContext, to_lock []Lockable, holder Lockable, hold
// a) in this case, we're holding every state mutex up to the resource being locked
// and all the owners passing a lock, so we can start to change state
// 2) req has children, and we will recurse(checking that locking is allowed) until we reach a leaf and can release the locks as we change state. The call will either return nil if state has changed, on an error if no state has changed
err := LockLockables(ctx, req_state.Requirements(), req, req_state, nodes)
err := LockLockables(ctx, req_state.Requirements(), req, nodes)
if err != nil {
return err
}
@ -438,7 +439,7 @@ func LockLockables(ctx * GraphContext, to_lock []Lockable, holder Lockable, hold
if owner_state.AllowedToTakeLock(holder.ID(), req.ID()) == false {
return fmt.Errorf("LOCKABLE_LOCK_ERR: %s is not allowed to take %s's lock from %s", holder.ID(), req.ID(), owner.ID())
}
err := LockLockables(ctx, req_state.Requirements(), req, req_state, nodes)
err := LockLockables(ctx, req_state.Requirements(), req, nodes)
return err
})
if err != nil {
@ -446,7 +447,7 @@ func LockLockables(ctx * GraphContext, to_lock []Lockable, holder Lockable, hold
}
}
} else {
err := LockLockables(ctx, req_state.Requirements(), req, req_state, nodes)
err := LockLockables(ctx, req_state.Requirements(), req, nodes)
if err != nil {
return err
}
@ -475,7 +476,7 @@ func LockLockables(ctx * GraphContext, to_lock []Lockable, holder Lockable, hold
return err
}
func UnlockLockables(ctx * GraphContext, to_unlock []Lockable, holder Lockable, holder_state LockableState, nodes NodeMap) error {
func UnlockLockables(ctx * GraphContext, to_unlock []Lockable, holder Lockable, nodes NodeMap) error {
if to_unlock == nil {
return fmt.Errorf("LOCKABLE_UNLOCK_ERR: no list provided")
}
@ -487,6 +488,7 @@ func UnlockLockables(ctx * GraphContext, to_unlock []Lockable, holder Lockable,
if holder == nil {
return fmt.Errorf("LOCKABLE_UNLOCK_ERR: nil cannot hold locks")
}
holder_state := holder.State().(LockableState)
// Called with no requirements to lock, success
if len(to_unlock) == 0 {
@ -527,7 +529,7 @@ func UnlockLockables(ctx * GraphContext, to_unlock []Lockable, holder Lockable,
return err
}
err = UnlockLockables(ctx, req_state.Requirements(), req, req_state, nodes)
err = UnlockLockables(ctx, req_state.Requirements(), req, nodes)
if err != nil {
return err
}

@ -63,7 +63,7 @@ func TestLockableSelfLock(t * testing.T) {
fatalErr(t, err)
err = UpdateStates(ctx, []GraphNode{r1}, func(nodes NodeMap) error {
return LockLockables(ctx, []Lockable{r1}, r1, nil, nodes)
return LockLockables(ctx, []Lockable{r1}, r1, nodes)
})
fatalErr(t, err)
@ -77,7 +77,7 @@ func TestLockableSelfLock(t * testing.T) {
fatalErr(t, err)
err = UpdateStates(ctx, []GraphNode{r1}, func(nodes NodeMap) error {
return UnlockLockables(ctx, []Lockable{r1}, r1, nil, nodes)
return UnlockLockables(ctx, []Lockable{r1}, r1, nodes)
})
fatalErr(t, err)
@ -105,7 +105,7 @@ func TestLockableSelfLockTiered(t * testing.T) {
fatalErr(t, err)
err = UpdateStates(ctx, []GraphNode{r3}, func(nodes NodeMap) error {
return LockLockables(ctx, []Lockable{r3}, r3, nil, nodes)
return LockLockables(ctx, []Lockable{r3}, r3, nodes)
})
fatalErr(t, err)
@ -124,7 +124,7 @@ func TestLockableSelfLockTiered(t * testing.T) {
fatalErr(t, err)
err = UpdateStates(ctx, []GraphNode{r3}, func(nodes NodeMap) error {
return UnlockLockables(ctx, []Lockable{r3}, r3, nil, nodes)
return UnlockLockables(ctx, []Lockable{r3}, r3, nodes)
})
fatalErr(t, err)
@ -159,8 +159,7 @@ func TestLockableLockOther(t * testing.T) {
fatalErr(t, err)
err = UpdateStates(ctx, []GraphNode{r1, r2}, func(nodes NodeMap) (error) {
node_state := r2.State().(LockableState)
err := LockLockables(ctx, []Lockable{r1}, r2, node_state, nodes)
err := LockLockables(ctx, []Lockable{r1}, r2, nodes)
fatalErr(t, err)
return nil
})
@ -177,8 +176,7 @@ func TestLockableLockOther(t * testing.T) {
fatalErr(t, err)
err = UpdateStates(ctx, []GraphNode{r2}, func(nodes NodeMap) (error) {
node_state := r2.State().(LockableState)
err := UnlockLockables(ctx, []Lockable{r1}, r2, node_state, nodes)
err := UnlockLockables(ctx, []Lockable{r1}, r2, nodes)
fatalErr(t, err)
return nil
})
@ -206,13 +204,12 @@ func TestLockableLockSimpleConflict(t * testing.T) {
fatalErr(t, err)
err = UpdateStates(ctx, []GraphNode{r1}, func(nodes NodeMap) error {
return LockLockables(ctx, []Lockable{r1}, r1, nil, nodes)
return LockLockables(ctx, []Lockable{r1}, r1, nodes)
})
fatalErr(t, err)
err = UpdateStates(ctx, []GraphNode{r2}, func(nodes NodeMap) (error) {
node_state := r2.State().(LockableState)
err := LockLockables(ctx, []Lockable{r1}, r2, node_state, nodes)
err := LockLockables(ctx, []Lockable{r1}, r2, nodes)
if err == nil {
t.Fatal("r2 took r1's lock from itself")
}
@ -232,7 +229,7 @@ func TestLockableLockSimpleConflict(t * testing.T) {
fatalErr(t, err)
err = UpdateStates(ctx, []GraphNode{r1}, func(nodes NodeMap) error {
return UnlockLockables(ctx, []Lockable{r1}, r1, nil, nodes)
return UnlockLockables(ctx, []Lockable{r1}, r1, nodes)
})
fatalErr(t, err)
@ -261,12 +258,12 @@ func TestLockableLockTieredConflict(t * testing.T) {
fatalErr(t, err)
err = UpdateStates(ctx, []GraphNode{r2}, func(nodes NodeMap) error {
return LockLockables(ctx, []Lockable{r2}, r2, nil, nodes)
return LockLockables(ctx, []Lockable{r2}, r2, nodes)
})
fatalErr(t, err)
err = UpdateStates(ctx, []GraphNode{r3}, func(nodes NodeMap) error {
return LockLockables(ctx, []Lockable{r3}, r3, nil, nodes)
return LockLockables(ctx, []Lockable{r3}, r3, nodes)
})
if err == nil {
t.Fatal("Locked r3 which depends on r1 while r2 which depends on r1 is already locked")
@ -375,8 +372,7 @@ func TestLockableDBLoad(t * testing.T){
fatalErr(t, err)
l6, err := NewSimpleLockable(ctx, "Test Lockable 6", []Lockable{})
err = UpdateStates(ctx, []GraphNode{l6, l3}, func(nodes NodeMap) error {
l6_state := l6.State().(LockableState)
err := LockLockables(ctx, []Lockable{l3}, l6, l6_state, nodes)
err := LockLockables(ctx, []Lockable{l3}, l6, nodes)
return err
})
fatalErr(t, err)

@ -450,7 +450,7 @@ func RunThread(ctx * GraphContext, thread Thread, first_action string) error {
owner_id = thread_state.Owner().ID()
}
if owner_id != thread.ID() {
return LockLockables(ctx, []Lockable{thread}, thread, nil, nodes)
return LockLockables(ctx, []Lockable{thread}, thread, nodes)
}
return nil
})
@ -500,7 +500,7 @@ func RunThread(ctx * GraphContext, thread Thread, first_action string) error {
}
err = UpdateStates(ctx, []GraphNode{thread}, func(nodes NodeMap) (error) {
return UnlockLockables(ctx, []Lockable{thread}, thread, nil, nodes)
return UnlockLockables(ctx, []Lockable{thread}, thread, nodes)
})
if err != nil {
ctx.Log.Logf("thread", "THREAD_RUN_UNLOCK_ERR: %e", err)