client: fix deadlock when connect to buildkitd fails
Before this change, if BUILDKIT_HOST was set to an invalid value that resulted in the connection of the grpc client to the server to fail, then deadlock occured waiting for the `eventsCh` to be closed. This happened because the call to the buildkit client's Build method returned an error before the provided callback was executed, which is where the `eventsCh` gets closed. This change places the creation of `eventsCh` inside the Build callback, which avoids the increment of the WaitGroup and thus the deadlock in this error path. Signed-off-by: Erik Sipsma <erik@sipsma.dev>
This commit is contained in:
@@ -189,12 +189,6 @@ func (c *Client) buildfn(ctx context.Context, pctx *plancontext.Context, fn DoFu
|
||||
wg.Done()
|
||||
}
|
||||
|
||||
// Catch solver's events
|
||||
// Closed manually
|
||||
eventsCh := make(chan *bk.SolveStatus)
|
||||
wg.Add(1)
|
||||
go catchOutput(eventsCh)
|
||||
|
||||
// Catch build events
|
||||
// Closed by buildkit
|
||||
buildCh := make(chan *bk.SolveStatus)
|
||||
@@ -202,6 +196,12 @@ func (c *Client) buildfn(ctx context.Context, pctx *plancontext.Context, fn DoFu
|
||||
go catchOutput(buildCh)
|
||||
|
||||
resp, err := c.c.Build(ctx, opts, "", func(ctx context.Context, gw bkgw.Client) (*bkgw.Result, error) {
|
||||
// Catch solver's events
|
||||
// Closed by solver.Stop
|
||||
eventsCh := make(chan *bk.SolveStatus)
|
||||
wg.Add(1)
|
||||
go catchOutput(eventsCh)
|
||||
|
||||
s := solver.New(solver.Opts{
|
||||
Control: c.c,
|
||||
Gateway: gw,
|
||||
|
Reference in New Issue
Block a user