mirror of
https://github.com/coder/coder.git
synced 2026-09-21 12:44:32 +08:00
fix: agentcontainers: fix flake when ctx cancelled while running docker inspect (#18526)
Should fix https://github.com/coder/internal/issues/738
This commit is contained in:
@@ -378,7 +378,11 @@ func (api *API) updaterLoop() {
|
||||
// and anyone looking to interact with the API.
|
||||
api.logger.Debug(api.ctx, "performing initial containers update")
|
||||
if err := api.updateContainers(api.ctx); err != nil {
|
||||
api.logger.Error(api.ctx, "initial containers update failed", slog.Error(err))
|
||||
if errors.Is(err, context.Canceled) {
|
||||
api.logger.Warn(api.ctx, "initial containers update canceled", slog.Error(err))
|
||||
} else {
|
||||
api.logger.Error(api.ctx, "initial containers update failed", slog.Error(err))
|
||||
}
|
||||
} else {
|
||||
api.logger.Debug(api.ctx, "initial containers update complete")
|
||||
}
|
||||
@@ -399,7 +403,11 @@ func (api *API) updaterLoop() {
|
||||
case api.updateTrigger <- done:
|
||||
err := <-done
|
||||
if err != nil {
|
||||
api.logger.Error(api.ctx, "updater loop ticker failed", slog.Error(err))
|
||||
if errors.Is(err, context.Canceled) {
|
||||
api.logger.Warn(api.ctx, "updater loop ticker canceled", slog.Error(err))
|
||||
} else {
|
||||
api.logger.Error(api.ctx, "updater loop ticker failed", slog.Error(err))
|
||||
}
|
||||
}
|
||||
default:
|
||||
api.logger.Debug(api.ctx, "updater loop ticker skipped, update in progress")
|
||||
|
||||
@@ -311,6 +311,10 @@ func (dcli *dockerCLI) List(ctx context.Context) (codersdk.WorkspaceAgentListCon
|
||||
// container IDs and returns the parsed output.
|
||||
// The stderr output is also returned for logging purposes.
|
||||
func runDockerInspect(ctx context.Context, execer agentexec.Execer, ids ...string) (stdout, stderr []byte, err error) {
|
||||
if ctx.Err() != nil {
|
||||
// If the context is done, we don't want to run the command.
|
||||
return []byte{}, []byte{}, ctx.Err()
|
||||
}
|
||||
var stdoutBuf, stderrBuf bytes.Buffer
|
||||
cmd := execer.CommandContext(ctx, "docker", append([]string{"inspect"}, ids...)...)
|
||||
cmd.Stdout = &stdoutBuf
|
||||
@@ -319,6 +323,12 @@ func runDockerInspect(ctx context.Context, execer agentexec.Execer, ids ...strin
|
||||
stdout = bytes.TrimSpace(stdoutBuf.Bytes())
|
||||
stderr = bytes.TrimSpace(stderrBuf.Bytes())
|
||||
if err != nil {
|
||||
if ctx.Err() != nil {
|
||||
// If the context was canceled while running the command,
|
||||
// return the context error instead of the command error,
|
||||
// which is likely to be "signal: killed".
|
||||
return stdout, stderr, ctx.Err()
|
||||
}
|
||||
if bytes.Contains(stderr, []byte("No such object:")) {
|
||||
// This can happen if a container is deleted between the time we check for its existence and the time we inspect it.
|
||||
return stdout, stderr, nil
|
||||
|
||||
Reference in New Issue
Block a user