mirror of
https://github.com/psviderski/uncloud.git
synced 2026-08-26 19:13:34 +00:00
run each container in global service in parallel
This commit is contained in:
@@ -147,24 +147,48 @@ func (cli *Client) runGlobalService(ctx context.Context, id string, spec api.Ser
|
|||||||
return resp, fmt.Errorf("list machines: %w", err)
|
return resp, fmt.Errorf("list machines: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wg := sync.WaitGroup{}
|
||||||
|
errCh := make(chan error)
|
||||||
|
mu := sync.Mutex{}
|
||||||
|
|
||||||
|
// Run a service container on each available machine.
|
||||||
for _, m := range machines {
|
for _, m := range machines {
|
||||||
// Run a service container on each available machine.
|
if m.State != pb.MachineMember_UP && m.State != pb.MachineMember_SUSPECT {
|
||||||
if m.State == pb.MachineMember_UP || m.State == pb.MachineMember_SUSPECT {
|
// TODO: return failed machines in the response.
|
||||||
// TODO: run each machine in a goroutine.
|
fmt.Printf("WARNING: failed to run a service container on machine '%s' which is Down.\n", m.Machine.Name)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
wg.Add(1)
|
||||||
|
go func() {
|
||||||
|
defer wg.Done()
|
||||||
|
|
||||||
runResp, err := cli.runContainer(ctx, id, spec, m.Machine)
|
runResp, err := cli.runContainer(ctx, id, spec, m.Machine)
|
||||||
// TODO: collect errors and return after trying all machines.
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return resp, fmt.Errorf("run container: %w", err)
|
errCh <- fmt.Errorf("run container on machine '%s': %w", m.Machine.Name, err)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mu.Lock()
|
||||||
resp.Containers = append(resp.Containers, MachineContainerID{
|
resp.Containers = append(resp.Containers, MachineContainerID{
|
||||||
MachineID: m.Machine.Id,
|
MachineID: m.Machine.Id,
|
||||||
ContainerID: runResp.ID,
|
ContainerID: runResp.ID,
|
||||||
})
|
})
|
||||||
}
|
mu.Unlock()
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
return resp, nil
|
go func() {
|
||||||
|
wg.Wait()
|
||||||
|
close(errCh)
|
||||||
|
}()
|
||||||
|
|
||||||
|
err = nil
|
||||||
|
for e := range errCh {
|
||||||
|
err = errors.Join(err, e)
|
||||||
|
}
|
||||||
|
|
||||||
|
return resp, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cli *Client) runContainer(
|
func (cli *Client) runContainer(
|
||||||
|
|||||||
Reference in New Issue
Block a user