diff --git a/ui/build/build.go b/ui/build/build.go index 9d5c330e1..54a4c27e5 100644 --- a/ui/build/build.go +++ b/ui/build/build.go @@ -283,11 +283,16 @@ func Build(ctx Context, config Config) { } rbeCh := make(chan bool) + var rbePanic any if config.StartRBE() { cleanupRBELogsDir(ctx, config) + checkRBERequirements(ctx, config) go func() { + defer func() { + rbePanic = recover() + close(rbeCh) + }() startRBE(ctx, config) - close(rbeCh) }() defer DumpRBEMetrics(ctx, config, filepath.Join(config.LogsDir(), "rbe_metrics.pb")) } else { @@ -345,6 +350,11 @@ func Build(ctx Context, config Config) { } <-rbeCh + if rbePanic != nil { + // If there was a ctx.Fatal in startRBE, rethrow it. + panic(rbePanic) + } + if what&RunNinja != 0 { if what&RunKati != 0 { installCleanIfNecessary(ctx, config) diff --git a/ui/build/rbe.go b/ui/build/rbe.go index 19a54dfc2..fa04207e0 100644 --- a/ui/build/rbe.go +++ b/ui/build/rbe.go @@ -95,14 +95,10 @@ func cleanupRBELogsDir(ctx Context, config Config) { } } -func startRBE(ctx Context, config Config) { +func checkRBERequirements(ctx Context, config Config) { if !config.GoogleProdCredsExist() && prodCredsAuthType(config) { ctx.Fatalf("Unable to start RBE reproxy\nFAILED: Missing LOAS credentials.") } - ctx.BeginTrace(metrics.RunSetupTool, "rbe_bootstrap") - defer ctx.EndTrace() - - ctx.Status.Status("Starting rbe...") if u := ulimitOrFatal(ctx, config, "-u"); u < rbeLeastNProcs { ctx.Fatalf("max user processes is insufficient: %d; want >= %d.\n", u, rbeLeastNProcs) @@ -115,6 +111,13 @@ func startRBE(ctx Context, config Config) { ctx.Fatalf("Unable to create logs dir (%v) for RBE: %v", config.rbeProxyLogsDir, err) } } +} + +func startRBE(ctx Context, config Config) { + ctx.BeginTrace(metrics.RunSetupTool, "rbe_bootstrap") + defer ctx.EndTrace() + + ctx.Status.Status("Starting rbe...") cmd := Command(ctx, config, "startRBE bootstrap", rbeCommand(ctx, config, bootstrapCmd))