From 95468ce2b333e87902b00f62f03f9da7bcc97af9 Mon Sep 17 00:00:00 2001 From: Tom Chauveau Date: Mon, 23 Aug 2021 15:15:05 +0200 Subject: [PATCH] Solve sub build miss synchronous behavior Signed-off-by: Tom Chauveau --- client/client.go | 23 ++++++++++++++++------- solver/solver.go | 32 ++++++++++++++++++++++++-------- 2 files changed, 40 insertions(+), 15 deletions(-) diff --git a/client/client.go b/client/client.go index 4709fa98..b0af9f22 100644 --- a/client/client.go +++ b/client/client.go @@ -170,16 +170,25 @@ func (c *Client) buildfn(ctx context.Context, st *state.State, env *environment. go catchOutput(buildCh) resp, err := c.c.Build(ctx, opts, "", func(ctx context.Context, gw bkgw.Client) (*bkgw.Result, error) { + eventsWg := sync.WaitGroup{} + closeCh := make(chan *bk.SolveStatus) + // Close events channel - defer close(eventsCh) + defer func() { + close(closeCh) + eventsWg.Wait() + close(eventsCh) + }() s := solver.New(solver.Opts{ - Control: c.c, - Gateway: gw, - Events: eventsCh, - Auth: auth, - Secrets: secrets, - NoCache: c.cfg.NoCache, + Control: c.c, + Gateway: gw, + Events: eventsCh, + EventsWg: &eventsWg, + CloseEvent: closeCh, + Auth: auth, + Secrets: secrets, + NoCache: c.cfg.NoCache, }) // Compute output overlay diff --git a/solver/solver.go b/solver/solver.go index 1df62ac5..4afff25e 100644 --- a/solver/solver.go +++ b/solver/solver.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "strings" + "sync" bk "github.com/moby/buildkit/client" "github.com/moby/buildkit/client/llb" @@ -23,12 +24,14 @@ type Solver struct { } type Opts struct { - Control *bk.Client - Gateway bkgw.Client - Events chan *bk.SolveStatus - Auth *RegistryAuthProvider - Secrets session.Attachable - NoCache bool + Control *bk.Client + Gateway bkgw.Client + Events chan *bk.SolveStatus + EventsWg *sync.WaitGroup + CloseEvent chan *bk.SolveStatus + Auth *RegistryAuthProvider + Secrets session.Attachable + NoCache bool } func New(opts Opts) Solver { @@ -169,11 +172,24 @@ func (s Solver) Export(ctx context.Context, st llb.State, img *dockerfile2llb.Im // Forward this build session events to the main events channel, for logging // purposes. go func() { - for event := range ch { - s.opts.Events <- event + select { + case <-s.opts.CloseEvent: + return + default: + for event := range ch { + s.opts.Events <- event + } } }() + // Add task to events + s.opts.EventsWg.Add(1) + + // Resolve event + defer func() { + s.opts.EventsWg.Done() + }() + return s.opts.Control.Build(ctx, opts, "", func(ctx context.Context, c bkgw.Client) (*bkgw.Result, error) { res, err := c.Solve(ctx, bkgw.SolveRequest{ Definition: def,