Fold a pending assignment into the value of its assignment key (issue 1094)
A wait for a build is the value of <node>.<module> with state pending and a pending object (id p-<unix nanoseconds>, a string), so every reader that skips a value with a state skips it, and the controller's own lists skip it through Stands. The transitions are compare-and-set on the key's revision (claim, release, settle, repoint, mark); assigning over a wait carries it into the value that stands, applied when it was waiting; a plan pass never overwrites it; one open wait per machine and module, and a key that holds the module refuses a new one. The table is no longer read or written, ForgetEndedPending is gone (no key is removed), and a wait of a machine the store dropped is none. Callers change type only; their conditions are the next issue.
This commit is contained in:
@@ -147,3 +147,21 @@ func (i *Inventory) BeginSwitchForTest(kind string) {
|
||||
i.moved.switching.Store(true)
|
||||
}
|
||||
}
|
||||
|
||||
// theChain is the chain this inventory writes and reads, opened if a command has not yet: for what has no table of its own
|
||||
// to be read from while it is moved (a pending assignment is a value of the assignments bucket from the start).
|
||||
func (i *Inventory) theChain(ctx context.Context) (*chain.Chain, error) {
|
||||
i.moved.mu.Lock()
|
||||
defer i.moved.mu.Unlock()
|
||||
if i.chain == nil && i.moved.open != nil {
|
||||
c, err := i.moved.open(ctx)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("%w: %v", ErrNoChain, err)
|
||||
}
|
||||
i.chain = c
|
||||
}
|
||||
if i.chain == nil {
|
||||
return nil, ErrNoChain
|
||||
}
|
||||
return i.chain, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user