Use a single chromium build for Perf runs if no patches are specified

BUG=skia:6681

Change-Id: I0bc3b6b7f9ca1693d539410c2bf1012d74a7c113
Reviewed-on: https://skia-review.googlesource.com/18031
Reviewed-by: Ravi Mistry <rmistry@google.com>
diff --git a/ct/go/master_scripts/run_chromium_perf_on_workers/main.go b/ct/go/master_scripts/run_chromium_perf_on_workers/main.go
index f336634..680f66a 100644
--- a/ct/go/master_scripts/run_chromium_perf_on_workers/main.go
+++ b/ct/go/master_scripts/run_chromium_perf_on_workers/main.go
@@ -171,21 +171,42 @@
 	benchmarkPatchLink = util.GCS_HTTP_LINK + filepath.Join(util.GCSBucketName, remoteOutputDir, benchmarkPatchName)
 	customWebpagesLink = util.GCS_HTTP_LINK + filepath.Join(util.GCSBucketName, remoteOutputDir, customWebpagesName)
 
-	// Create the two required chromium builds (with patch and without the patch).
-	chromiumBuilds, err := util.TriggerBuildRepoSwarmingTask(
-		"build_chromium", *runID, "chromium", *targetPlatform, []string{},
-		[]string{filepath.Join(remoteOutputDir, chromiumPatchName), filepath.Join(remoteOutputDir, skiaPatchName)},
-		/*singlebuild*/ false, 3*time.Hour, 1*time.Hour)
-	if err != nil {
-		sklog.Errorf("Error encountered when swarming build repo task: %s", err)
-		return
+	// Check if the patches have any content to decide if we need one or two chromium builds.
+	localPatches := []string{filepath.Join(os.TempDir(), chromiumPatchName), filepath.Join(os.TempDir(), skiaPatchName)}
+	remotePatches := []string{filepath.Join(remoteOutputDir, chromiumPatchName), filepath.Join(remoteOutputDir, skiaPatchName)}
+	var chromiumBuildNoPatch, chromiumBuildWithPatch string
+	if util.PatchesAreEmpty(localPatches) {
+		// Create only one chromium build.
+		chromiumBuilds, err := util.TriggerBuildRepoSwarmingTask(
+			"build_chromium", *runID, "chromium", *targetPlatform, []string{}, remotePatches,
+			/*singlebuild*/ true, 3*time.Hour, 1*time.Hour)
+		if err != nil {
+			sklog.Errorf("Error encountered when swarming build repo task: %s", err)
+			return
+		}
+		if len(chromiumBuilds) != 1 {
+			sklog.Errorf("Expected 1 build but instead got %d: %v.", len(chromiumBuilds), chromiumBuilds)
+			return
+		}
+		chromiumBuildNoPatch = chromiumBuilds[0]
+		chromiumBuildWithPatch = chromiumBuilds[0]
+
+	} else {
+		// Create the two required chromium builds (with patch and without the patch).
+		chromiumBuilds, err := util.TriggerBuildRepoSwarmingTask(
+			"build_chromium", *runID, "chromium", *targetPlatform, []string{}, remotePatches,
+			/*singlebuild*/ false, 3*time.Hour, 1*time.Hour)
+		if err != nil {
+			sklog.Errorf("Error encountered when swarming build repo task: %s", err)
+			return
+		}
+		if len(chromiumBuilds) != 2 {
+			sklog.Errorf("Expected 2 builds but instead got %d: %v.", len(chromiumBuilds), chromiumBuilds)
+			return
+		}
+		chromiumBuildNoPatch = chromiumBuilds[0]
+		chromiumBuildWithPatch = chromiumBuilds[1]
 	}
-	if len(chromiumBuilds) != 2 {
-		sklog.Errorf("Expected 2 builds but instead got %d: %v.", len(chromiumBuilds), chromiumBuilds)
-		return
-	}
-	chromiumBuildNoPatch := chromiumBuilds[0]
-	chromiumBuildWithPatch := chromiumBuilds[1]
 
 	// Parse out the Chromium and Skia hashes.
 	chromiumHash, skiaHash := util.GetHashesFromBuild(chromiumBuildNoPatch)
diff --git a/ct/go/util/chromium_builds.go b/ct/go/util/chromium_builds.go
index fa2e1ef..0f81e9e 100644
--- a/ct/go/util/chromium_builds.go
+++ b/ct/go/util/chromium_builds.go
@@ -298,3 +298,13 @@
 	}
 	return nil
 }
+
+func PatchesAreEmpty(patches []string) bool {
+	for _, p := range patches {
+		fInfo, err := os.Stat(p)
+		if err == nil && fInfo.Size() > 10 {
+			return false
+		}
+	}
+	return true
+}
diff --git a/ct/go/util/util.go b/ct/go/util/util.go
index 31706ec..68f4ded 100644
--- a/ct/go/util/util.go
+++ b/ct/go/util/util.go
@@ -383,6 +383,10 @@
 	}
 	s, err := swarming.NewSwarmingClient(workDir, swarming.SWARMING_SERVER_PRIVATE, isolate.ISOLATE_SERVER_URL_PRIVATE)
 	if err != nil {
+		// Cleanup workdir.
+		if err := os.RemoveAll(workDir); err != nil {
+			sklog.Errorf("Could not cleanup swarming work dir: %s", err)
+		}
 		return 0, fmt.Errorf("Could not instantiate swarming client: %s", err)
 	}
 	defer s.Cleanup()
@@ -730,6 +734,10 @@
 	}
 	s, err := swarming.NewSwarmingClient(workDir, swarming.SWARMING_SERVER_PRIVATE, isolate.ISOLATE_SERVER_URL_PRIVATE)
 	if err != nil {
+		// Cleanup workdir.
+		if err := os.RemoveAll(workDir); err != nil {
+			sklog.Errorf("Could not cleanup swarming work dir: %s", err)
+		}
 		return nil, fmt.Errorf("Could not instantiate swarming client: %s", err)
 	}
 	defer s.Cleanup()
diff --git a/ct/go/worker_scripts/run_chromium_perf/main.go b/ct/go/worker_scripts/run_chromium_perf/main.go
index b74de41..14bc9b9 100644
--- a/ct/go/worker_scripts/run_chromium_perf/main.go
+++ b/ct/go/worker_scripts/run_chromium_perf/main.go
@@ -134,8 +134,13 @@
 		customWebpages = customWebpages[startIndex:endIndex]
 	}
 
+	chromiumBuilds := []string{*chromiumBuildNoPatch}
+	// No point downloading the same build twice. Download only if builds are different.
+	if *chromiumBuildNoPatch != *chromiumBuildWithPatch {
+		chromiumBuilds = append(chromiumBuilds, *chromiumBuildWithPatch)
+	}
 	// Download the specified chromium builds.
-	for _, chromiumBuild := range []string{*chromiumBuildNoPatch, *chromiumBuildWithPatch} {
+	for _, chromiumBuild := range chromiumBuilds {
 		if err := gs.DownloadChromiumBuild(chromiumBuild); err != nil {
 			return err
 		}