diff --git a/clioptions/client.go b/clioptions/client.go index 8aa4d289..959e24c4 100644 --- a/clioptions/client.go +++ b/clioptions/client.go @@ -64,7 +64,7 @@ func (c *ClientOptions) loadTLSConfig() (*tls.Config, error) { } cert, err := tls.LoadX509KeyPair(c.ClientCertPath, c.ClientKeyPath) if err != nil { - return nil, fmt.Errorf("failed to load certs: %s", err) + return nil, fmt.Errorf("failed to load certs: %w", err) } tlsConfig.Certificates = []tls.Certificate{cert} return tlsConfig, nil diff --git a/loadgen/generic_executor.go b/loadgen/generic_executor.go index df28e3c8..3f653992 100644 --- a/loadgen/generic_executor.go +++ b/loadgen/generic_executor.go @@ -151,11 +151,14 @@ func (g *genericRun) Run(ctx context.Context) error { backoff, retry := run.ShouldRetry(err) if retry { + // Transient: this attempt is superseded by the retry and + // never propagated, so log it here as the only record. err = fmt.Errorf("iteration %v encountered error: %w", run.Iteration, err) g.logger.Error(err) } else { + // Terminal: propagated via doneCh and reported by Run's + // caller, so don't also log it here. err = fmt.Errorf("iteration %v failed: %w", run.Iteration, err) - g.logger.Error(err) break retryLoop } diff --git a/loadgen/scenario.go b/loadgen/scenario.go index 26599332..accd3dd3 100644 --- a/loadgen/scenario.go +++ b/loadgen/scenario.go @@ -306,22 +306,10 @@ func (s *ScenarioInfo) RegisterDefaultSearchAttributes(ctx context.Context) erro }, Namespace: s.Namespace, }) - // Throw an error if the attributes could not be registered, but ignore already exists errs - alreadyExistsStrings := []string{ - "already exists", - "attributes mapping unavailble", - } - if err != nil { - isAlreadyExistsErr := false - for _, s := range alreadyExistsStrings { - if strings.Contains(err.Error(), s) { - isAlreadyExistsErr = true - break - } - } - if !isAlreadyExistsErr { - return fmt.Errorf("failed to register search attributes: %w", err) - } + // Throw an error if the attributes could not be registered, but ignore the + // case where they already exist (re-registration on a reused namespace). + if err != nil && status.Code(err) != codes.AlreadyExists { + return fmt.Errorf("failed to register search attributes: %w", err) } return nil } @@ -428,14 +416,13 @@ func (r *Run) ExecuteKitchenSinkWorkflow(ctx context.Context, options *KitchenSi err := executor.ExecuteClientSequence(cancelCtx, clientSeq) if err != nil { clientActionsErrPtr.Store(&err) - r.Logger.Error("Client actions failed: ", clientActionsErrPtr) + r.Logger.Error("Client actions failed: ", err) cancel() // TODO: Remove or change to "always terminate when exiting early" flag - err := r.Client.TerminateWorkflow( - ctx, options.StartOptions.ID, "", "client actions failed", nil) - if err != nil { - return + if terminateErr := r.Client.TerminateWorkflow( + ctx, options.StartOptions.ID, "", "client actions failed", nil); terminateErr != nil { + r.Logger.Errorf("Failed to terminate workflow after client actions failure: %v", terminateErr) } } }() diff --git a/scenarios/ebb_and_flow.go b/scenarios/ebb_and_flow.go index 3ef39bef..e1297dec 100644 --- a/scenarios/ebb_and_flow.go +++ b/scenarios/ebb_and_flow.go @@ -281,7 +281,9 @@ func (e *ebbAndFlowExecutor) spawnWorkflowWithActivities( // Start workflow. run := e.NewRun(int(iteration)) - e.RegisterDefaultSearchAttributes(ctx) + if err := e.RegisterDefaultSearchAttributes(ctx); err != nil { + return fmt.Errorf("failed to register search attributes for iteration %d: %w", iteration, err) + } options := run.DefaultStartWorkflowOptions() options.ID = fmt.Sprintf("%s-track-%d", e.id, iteration) options.WorkflowExecutionErrorWhenAlreadyStarted = false @@ -303,10 +305,12 @@ func (e *ebbAndFlowExecutor) spawnWorkflowWithActivities( // Wait for workflow completion var result ebbandflow.WorkflowOutput err = wf.Get(ctx, &result) + // The batch has settled either way, so drain it from the backlog the + // controller tracks; only a successful workflow counts as completed. + e.completedActivities.Add(activities) if err != nil { - e.Logger.Errorf("ebbAndFlowTrack workflow failed for iteration %d: %v", iteration, err) + return fmt.Errorf("ebbAndFlowTrack workflow failed for iteration %d: %w", iteration, err) } - e.completedActivities.Add(activities) e.incrementTotalCompletedWorkflow() return nil