Skip to content

Commit cd38624

Browse files
committed
llb: rewrite llb.Async with CachedGroup
Signed-off-by: Tonis Tiigi <[email protected]>
1 parent d4951f0 commit cd38624

File tree

2 files changed

+24
-49
lines changed

2 files changed

+24
-49
lines changed

client/llb/async.go

Lines changed: 16 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -6,76 +6,46 @@ import (
66
"github.com/moby/buildkit/solver/pb"
77
"github.com/moby/buildkit/util/flightcontrol"
88
digest "github.com/opencontainers/go-digest"
9-
"github.com/pkg/errors"
109
)
1110

1211
type asyncState struct {
13-
f func(context.Context, State, *Constraints) (State, error)
14-
prev State
15-
target State
16-
set bool
17-
err error
18-
g flightcontrol.Group[State]
12+
f func(context.Context, State, *Constraints) (State, error)
13+
prev State
14+
g flightcontrol.CachedGroup[State]
1915
}
2016

2117
func (as *asyncState) Output() Output {
2218
return as
2319
}
2420

2521
func (as *asyncState) Vertex(ctx context.Context, c *Constraints) Vertex {
26-
err := as.Do(ctx, c)
22+
target, err := as.Do(ctx, c)
2723
if err != nil {
2824
return &errVertex{err}
2925
}
30-
if as.set {
31-
out := as.target.Output()
32-
if out == nil {
33-
return nil
34-
}
35-
return out.Vertex(ctx, c)
26+
out := target.Output()
27+
if out == nil {
28+
return nil
3629
}
37-
return nil
30+
return out.Vertex(ctx, c)
3831
}
3932

4033
func (as *asyncState) ToInput(ctx context.Context, c *Constraints) (*pb.Input, error) {
41-
err := as.Do(ctx, c)
34+
target, err := as.Do(ctx, c)
4235
if err != nil {
4336
return nil, err
4437
}
45-
if as.set {
46-
out := as.target.Output()
47-
if out == nil {
48-
return nil, nil
49-
}
50-
return out.ToInput(ctx, c)
38+
out := target.Output()
39+
if out == nil {
40+
return nil, nil
5141
}
52-
return nil, nil
42+
return out.ToInput(ctx, c)
5343
}
5444

55-
func (as *asyncState) Do(ctx context.Context, c *Constraints) error {
56-
_, err := as.g.Do(ctx, "", func(ctx context.Context) (State, error) {
57-
if as.set {
58-
return as.target, as.err
59-
}
60-
res, err := as.f(ctx, as.prev, c)
61-
if err != nil {
62-
select {
63-
case <-ctx.Done():
64-
if errors.Is(err, context.Cause(ctx)) {
65-
return res, err
66-
}
67-
default:
68-
}
69-
}
70-
as.target = res
71-
as.err = err
72-
as.set = true
73-
return res, err
45+
func (as *asyncState) Do(ctx context.Context, c *Constraints) (State, error) {
46+
return as.g.Do(ctx, "", func(ctx context.Context) (State, error) {
47+
return as.f(ctx, as.prev, c)
7448
})
75-
if err != nil {
76-
return err
77-
}
78-
return as.err
7949
}
8050

8151
type errVertex struct {

client/llb/state.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,11 +104,11 @@ func (s State) getValue(k interface{}) func(context.Context, *Constraints) (inte
104104
}
105105
if s.async != nil {
106106
return func(ctx context.Context, c *Constraints) (interface{}, error) {
107-
err := s.async.Do(ctx, c)
107+
target, err := s.async.Do(ctx, c)
108108
if err != nil {
109109
return nil, err
110110
}
111-
return s.async.target.getValue(k)(ctx, c)
111+
return target.getValue(k)(ctx, c)
112112
}
113113
}
114114
if s.prev == nil {
@@ -118,8 +118,13 @@ func (s State) getValue(k interface{}) func(context.Context, *Constraints) (inte
118118
}
119119

120120
func (s State) Async(f func(context.Context, State, *Constraints) (State, error)) State {
121+
as := &asyncState{
122+
f: f,
123+
prev: s,
124+
}
125+
as.g.CacheError = true
121126
s2 := State{
122-
async: &asyncState{f: f, prev: s},
127+
async: as,
123128
}
124129
return s2
125130
}

0 commit comments

Comments
 (0)