mirror of
https://github.com/coder/coder.git
synced 2025-07-15 22:20:27 +00:00
fix(agent/agentcontainers): prevent reassigning proc.agent until successful (#18609)
This commit is contained in:
committed by
GitHub
parent
09cc906981
commit
4f44dd08a9
@ -1484,7 +1484,9 @@ func (api *API) maybeInjectSubAgentIntoContainerLocked(ctx context.Context, dc c
|
|||||||
originalName := subAgentConfig.Name
|
originalName := subAgentConfig.Name
|
||||||
|
|
||||||
for attempt := 1; attempt <= maxAttemptsToNameAgent; attempt++ {
|
for attempt := 1; attempt <= maxAttemptsToNameAgent; attempt++ {
|
||||||
if proc.agent, err = client.Create(ctx, subAgentConfig); err == nil {
|
agent, err := client.Create(ctx, subAgentConfig)
|
||||||
|
if err == nil {
|
||||||
|
proc.agent = agent // Only reassign on success.
|
||||||
if api.usingWorkspaceFolderName[dc.WorkspaceFolder] {
|
if api.usingWorkspaceFolderName[dc.WorkspaceFolder] {
|
||||||
api.devcontainerNames[dc.Name] = true
|
api.devcontainerNames[dc.Name] = true
|
||||||
delete(api.usingWorkspaceFolderName, dc.WorkspaceFolder)
|
delete(api.usingWorkspaceFolderName, dc.WorkspaceFolder)
|
||||||
@ -1492,7 +1494,6 @@ func (api *API) maybeInjectSubAgentIntoContainerLocked(ctx context.Context, dc c
|
|||||||
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(DanielleMaywood):
|
// NOTE(DanielleMaywood):
|
||||||
// Ordinarily we'd use `errors.As` here, but it didn't appear to work. Not
|
// Ordinarily we'd use `errors.As` here, but it didn't appear to work. Not
|
||||||
// sure if this is because of the communication protocol? Instead I've opted
|
// sure if this is because of the communication protocol? Instead I've opted
|
||||||
|
@ -188,7 +188,7 @@ func (a *subAgentAPIClient) List(ctx context.Context) ([]SubAgent, error) {
|
|||||||
return agents, nil
|
return agents, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *subAgentAPIClient) Create(ctx context.Context, agent SubAgent) (SubAgent, error) {
|
func (a *subAgentAPIClient) Create(ctx context.Context, agent SubAgent) (_ SubAgent, err error) {
|
||||||
a.logger.Debug(ctx, "creating sub agent", slog.F("name", agent.Name), slog.F("directory", agent.Directory))
|
a.logger.Debug(ctx, "creating sub agent", slog.F("name", agent.Name), slog.F("directory", agent.Directory))
|
||||||
|
|
||||||
displayApps := make([]agentproto.CreateSubAgentRequest_DisplayApp, 0, len(agent.DisplayApps))
|
displayApps := make([]agentproto.CreateSubAgentRequest_DisplayApp, 0, len(agent.DisplayApps))
|
||||||
@ -233,19 +233,27 @@ func (a *subAgentAPIClient) Create(ctx context.Context, agent SubAgent) (SubAgen
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return SubAgent{}, err
|
return SubAgent{}, err
|
||||||
}
|
}
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
// Best effort.
|
||||||
|
_, _ = a.api.DeleteSubAgent(ctx, &agentproto.DeleteSubAgentRequest{
|
||||||
|
Id: resp.GetAgent().GetId(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
agent.Name = resp.Agent.Name
|
agent.Name = resp.GetAgent().GetName()
|
||||||
agent.ID, err = uuid.FromBytes(resp.Agent.Id)
|
agent.ID, err = uuid.FromBytes(resp.GetAgent().GetId())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return agent, err
|
return SubAgent{}, err
|
||||||
}
|
}
|
||||||
agent.AuthToken, err = uuid.FromBytes(resp.Agent.AuthToken)
|
agent.AuthToken, err = uuid.FromBytes(resp.GetAgent().GetAuthToken())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return agent, err
|
return SubAgent{}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, appError := range resp.AppCreationErrors {
|
for _, appError := range resp.GetAppCreationErrors() {
|
||||||
app := apps[appError.Index]
|
app := apps[appError.GetIndex()]
|
||||||
|
|
||||||
a.logger.Warn(ctx, "unable to create app",
|
a.logger.Warn(ctx, "unable to create app",
|
||||||
slog.F("agent_name", agent.Name),
|
slog.F("agent_name", agent.Name),
|
||||||
|
Reference in New Issue
Block a user