aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKousik Kumar <kousikk@google.com>2022-05-27 07:48:37 -0400
committerKousik Kumar <kousikk@google.com>2022-06-30 15:20:48 +0000
commit040867f3b884c1e5959b7075e16bcae4230a2ada (patch)
tree98496ef53686780b124eae95cf52e1a876d07144
parentf75e6a131b87608e09ed4864b683555fb7d46acf (diff)
downloadsoong-040867f3b884c1e5959b7075e16bcae4230a2ada.tar.gz
[RESTRICT AUTOMERGE] Cleanup RBE logs directory
RBE logs directory is currently messy: 1. We use RBE_output_dir variable to specify where rbe_metrics.txt / rbe_metrics.pb file should go to. 2. We use proxy_log_dir to specify where *.rpl / *.rpi (detailed per action info log file) should go to. 3. We use RBE_log_dir to specify where reproxy.* / bootstrap.* log files should go to. Ideally, all RBE related logs should go to one single directory. In this CL, I'm creating a temporary log directory under out/soong/.temp/rbe/ where all RBE related log files per build would go to. The log dir prefix is also being set to the same prefix as the socket address file. Test: Ran a sample build with `m libc` and ensured that logs are getting cleared across rebuilds and that `rbe_metrics.pb` file is properly generated and being copied to the right location (i.e., from out/soong/.temp/rbe/<rand> to out/ dir) Bug: b/233382420 Bug: b/236909178 Bug: b/235861862 Merged-In: I46bd38d50419cb9e54e8202d24222979e47ff5ca Change-Id: I46bd38d50419cb9e54e8202d24222979e47ff5ca (cherry picked from commit 29cbe14265c9679d6de5a5785a95137c178fe1eb)
-rw-r--r--ui/build/build.go1
-rw-r--r--ui/build/config.go59
-rw-r--r--ui/build/rbe.go47
-rw-r--r--ui/build/rbe_test.go3
4 files changed, 63 insertions, 47 deletions
diff --git a/ui/build/build.go b/ui/build/build.go
index 9668efde0..8f7f64b11 100644
--- a/ui/build/build.go
+++ b/ui/build/build.go
@@ -244,6 +244,7 @@ func Build(ctx Context, config Config) {
}
if config.StartRBE() {
+ cleanupRBELogsDir(ctx, config)
startRBE(ctx, config)
defer DumpRBEMetrics(ctx, config, filepath.Join(config.LogsDir(), "rbe_metrics.pb"))
}
diff --git a/ui/build/config.go b/ui/build/config.go
index 4ee759f85..249af3a1a 100644
--- a/ui/build/config.go
+++ b/ui/build/config.go
@@ -18,11 +18,13 @@ import (
"encoding/json"
"fmt"
"io/ioutil"
+ "math/rand"
"os"
"path/filepath"
"runtime"
"strconv"
"strings"
+ "syscall"
"time"
"android/soong/shared"
@@ -37,6 +39,15 @@ const (
jsonSuffix = "json"
)
+var (
+ rbeRandPrefix int
+)
+
+func init() {
+ rand.Seed(time.Now().UnixNano())
+ rbeRandPrefix = rand.Intn(1000)
+}
+
type Config struct{ *configImpl }
type configImpl struct {
@@ -998,34 +1009,25 @@ func (c *configImpl) StartRBE() bool {
return true
}
-func (c *configImpl) rbeLogDir() string {
- for _, f := range []string{"RBE_log_dir", "FLAG_log_dir"} {
- if v, ok := c.environ.Get(f); ok {
- return v
- }
- }
- if c.Dist() {
- return c.LogsDir()
- }
- return c.OutDir()
-}
-
-func (c *configImpl) rbeStatsOutputDir() string {
- for _, f := range []string{"RBE_output_dir", "FLAG_output_dir"} {
+func (c *configImpl) rbeProxyLogsDir() string {
+ for _, f := range []string{"RBE_proxy_log_dir", "FLAG_output_dir"} {
if v, ok := c.environ.Get(f); ok {
return v
}
}
- return c.rbeLogDir()
+ buildTmpDir := shared.TempDirForOutDir(c.SoongOutDir())
+ return filepath.Join(buildTmpDir, "rbe")
}
-func (c *configImpl) rbeLogPath() string {
- for _, f := range []string{"RBE_log_path", "FLAG_log_path"} {
- if v, ok := c.environ.Get(f); ok {
- return v
+func (c *configImpl) shouldCleanupRBELogsDir() bool {
+ // Perform a log directory cleanup only when the log directory
+ // is auto created by the build rather than user-specified.
+ for _, f := range []string{"RBE_proxy_log_dir", "FLAG_output_dir"} {
+ if _, ok := c.environ.Get(f); ok {
+ return false
}
}
- return fmt.Sprintf("text://%v/reproxy_log.txt", c.rbeLogDir())
+ return true
}
func (c *configImpl) rbeExecRoot() string {
@@ -1077,6 +1079,23 @@ func (c *configImpl) rbeAuth() (string, string) {
return "RBE_use_application_default_credentials", "true"
}
+func (c *configImpl) rbeSockAddr(dir string) (string, error) {
+ maxNameLen := len(syscall.RawSockaddrUnix{}.Path)
+ base := fmt.Sprintf("reproxy_%v.sock", rbeRandPrefix)
+
+ name := filepath.Join(dir, base)
+ if len(name) < maxNameLen {
+ return name, nil
+ }
+
+ name = filepath.Join("/tmp", base)
+ if len(name) < maxNameLen {
+ return name, nil
+ }
+
+ return "", fmt.Errorf("cannot generate a proxy socket address shorter than the limit of %v", maxNameLen)
+}
+
func (c *configImpl) UseRemoteBuild() bool {
return c.UseGoma() || c.UseRBE()
}
diff --git a/ui/build/rbe.go b/ui/build/rbe.go
index 8f9a69991..3e558f738 100644
--- a/ui/build/rbe.go
+++ b/ui/build/rbe.go
@@ -16,12 +16,9 @@ package build
import (
"fmt"
- "math/rand"
"os"
"path/filepath"
"runtime"
- "syscall"
- "time"
"android/soong/ui/metrics"
)
@@ -54,34 +51,16 @@ func rbeCommand(ctx Context, config Config, rbeCmd string) string {
return cmdPath
}
-func sockAddr(dir string) (string, error) {
- maxNameLen := len(syscall.RawSockaddrUnix{}.Path)
- rand.Seed(time.Now().UnixNano())
- base := fmt.Sprintf("reproxy_%v.sock", rand.Intn(1000))
-
- name := filepath.Join(dir, base)
- if len(name) < maxNameLen {
- return name, nil
- }
-
- name = filepath.Join("/tmp", base)
- if len(name) < maxNameLen {
- return name, nil
- }
-
- return "", fmt.Errorf("cannot generate a proxy socket address shorter than the limit of %v", maxNameLen)
-}
-
func getRBEVars(ctx Context, config Config) map[string]string {
vars := map[string]string{
- "RBE_log_path": config.rbeLogPath(),
- "RBE_log_dir": config.rbeLogDir(),
+ "RBE_log_dir": config.rbeProxyLogsDir(),
"RBE_re_proxy": config.rbeReproxy(),
"RBE_exec_root": config.rbeExecRoot(),
- "RBE_output_dir": config.rbeStatsOutputDir(),
+ "RBE_output_dir": config.rbeProxyLogsDir(),
+ "RBE_proxy_log_dir": config.rbeProxyLogsDir(),
}
if config.StartRBE() {
- name, err := sockAddr(absPath(ctx, config.TempDir()))
+ name, err := config.rbeSockAddr(absPath(ctx, config.TempDir()))
if err != nil {
ctx.Fatalf("Error retrieving socket address: %v", err)
return nil
@@ -100,6 +79,17 @@ func getRBEVars(ctx Context, config Config) map[string]string {
return vars
}
+func cleanupRBELogsDir(ctx Context, config Config) {
+ if !config.shouldCleanupRBELogsDir() {
+ return
+ }
+
+ rbeTmpDir := config.rbeProxyLogsDir()
+ if err := os.RemoveAll(rbeTmpDir); err != nil {
+ fmt.Fprintln(ctx.Writer, "\033[33mUnable to remove RBE log directory: ", err, "\033[0m")
+ }
+}
+
func startRBE(ctx Context, config Config) {
ctx.BeginTrace(metrics.RunSetupTool, "rbe_bootstrap")
defer ctx.EndTrace()
@@ -110,6 +100,11 @@ func startRBE(ctx Context, config Config) {
if n := ulimitOrFatal(ctx, config, "-n"); n < rbeLeastNFiles {
ctx.Fatalf("max open files is insufficient: %d; want >= %d.\n", n, rbeLeastNFiles)
}
+ if _, err := os.Stat(config.rbeProxyLogsDir()); os.IsNotExist(err) {
+ if err := os.MkdirAll(config.rbeProxyLogsDir(), 0744); err != nil {
+ ctx.Fatalf("Unable to create logs dir (%v) for RBE: %v", config.rbeProxyLogsDir, err)
+ }
+ }
cmd := Command(ctx, config, "startRBE bootstrap", rbeCommand(ctx, config, bootstrapCmd))
@@ -151,7 +146,7 @@ func DumpRBEMetrics(ctx Context, config Config, filename string) {
return
}
- outputDir := config.rbeStatsOutputDir()
+ outputDir := config.rbeProxyLogsDir()
if outputDir == "" {
ctx.Fatal("RBE output dir variable not defined. Aborting metrics dumping.")
}
diff --git a/ui/build/rbe_test.go b/ui/build/rbe_test.go
index 8ff96bcbb..266f76b35 100644
--- a/ui/build/rbe_test.go
+++ b/ui/build/rbe_test.go
@@ -56,7 +56,8 @@ func TestDumpRBEMetrics(t *testing.T) {
env := Environment(tt.env)
env.Set("OUT_DIR", tmpDir)
env.Set("RBE_DIR", tmpDir)
- env.Set("RBE_output_dir", t.TempDir())
+ env.Set("RBE_output_dir", tmpDir)
+ env.Set("RBE_proxy_log_dir", tmpDir)
config := Config{&configImpl{
environ: &env,
}}