Mirror of @tangled.org/core. Running on a Raspberry Pi Zero 2 (Please be gentle).
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

spindle/engine: don't cancel the whole workflow group on the first error

Signed-off-by: Evan Jarrett <evan@evanjarrett.com>

authored by

Evan Jarrett and committed by
Tangled
63c61679 0bf2bb0a

+17 -20
+17 -20
spindle/engine/engine.go
··· 3 3 import ( 4 4 "context" 5 5 "errors" 6 - "fmt" 7 6 "log/slog" 7 + "sync" 8 8 9 9 securejoin "github.com/cyphar/filepath-securejoin" 10 - "golang.org/x/sync/errgroup" 11 10 "tangled.org/core/notifier" 12 11 "tangled.org/core/spindle/config" 13 12 "tangled.org/core/spindle/db" ··· 30 31 } 31 32 } 32 33 33 - eg, ctx := errgroup.WithContext(ctx) 34 + var wg sync.WaitGroup 34 35 for eng, wfs := range pipeline.Workflows { 35 36 workflowTimeout := eng.WorkflowTimeout() 36 37 l.Info("using workflow timeout", "timeout", workflowTimeout) 37 38 38 39 for _, w := range wfs { 39 - eg.Go(func() error { 40 + wg.Add(1) 41 + go func() { 42 + defer wg.Done() 43 + 40 44 wid := models.WorkflowId{ 41 45 PipelineId: pipelineId, 42 46 Name: w.Name, ··· 47 45 48 46 err := db.StatusRunning(wid, n) 49 47 if err != nil { 50 - return err 48 + l.Error("failed to set workflow status to running", "wid", wid, "err", err) 49 + return 51 50 } 52 51 53 52 err = eng.SetupWorkflow(ctx, wid, &w) ··· 64 61 65 62 dbErr := db.StatusFailed(wid, err.Error(), -1, n) 66 63 if dbErr != nil { 67 - return dbErr 64 + l.Error("failed to set workflow status to failed", "wid", wid, "err", dbErr) 68 65 } 69 - return err 66 + return 70 67 } 71 68 defer eng.DestroyWorkflow(ctx, wid) 72 69 ··· 102 99 if errors.Is(err, ErrTimedOut) { 103 100 dbErr := db.StatusTimeout(wid, n) 104 101 if dbErr != nil { 105 - return dbErr 102 + l.Error("failed to set workflow status to timeout", "wid", wid, "err", dbErr) 106 103 } 107 104 } else { 108 105 dbErr := db.StatusFailed(wid, err.Error(), -1, n) 109 106 if dbErr != nil { 110 - return dbErr 107 + l.Error("failed to set workflow status to failed", "wid", wid, "err", dbErr) 111 108 } 112 109 } 113 - 114 - return fmt.Errorf("starting steps image: %w", err) 110 + return 115 111 } 116 112 } 117 113 118 114 err = db.StatusSuccess(wid, n) 119 115 if err != nil { 120 - return err 116 + l.Error("failed to set workflow status to success", "wid", wid, "err", err) 121 117 } 122 - 123 - return nil 124 - }) 118 + }() 125 119 } 126 120 } 127 121 128 - if err := eg.Wait(); err != nil { 129 - l.Error("failed to run one or more workflows", "err", err) 130 - } else { 131 - l.Info("successfully ran full pipeline") 132 - } 122 + wg.Wait() 123 + l.Info("all workflows completed") 133 124 }