blob: 0613076ffa41cf9f79a2ff6f17380bcccd315748 [file] [log] [blame]
package frontend
import (
"context"
"fmt"
"go.skia.org/infra/fuzzer/go/config"
"go.skia.org/infra/fuzzer/go/download_skia"
"go.skia.org/infra/fuzzer/go/frontend/gcsloader"
"go.skia.org/infra/fuzzer/go/frontend/syncer"
"go.skia.org/infra/fuzzer/go/storage"
"go.skia.org/infra/go/gcs"
"go.skia.org/infra/go/sklog"
)
// VersionUpdater is a struct that will handle the updating from one version to fuzz to another
// for the frontend.
// It will handle both a pending change and a current change.
type VersionUpdater struct {
gcsLoader *gcsloader.GCSLoader
syncer *syncer.FuzzSyncer
}
// NewVersionUpdater returns a VersionUpdater.
func NewVersionUpdater(g *gcsloader.GCSLoader, syncer *syncer.FuzzSyncer) *VersionUpdater {
return &VersionUpdater{
gcsLoader: g,
syncer: syncer,
}
}
// HandleCurrentVersion sets the current version of Skia to be the specified value and calls
// LoadFreshFromGoogleStorage.
func (v *VersionUpdater) HandleCurrentVersion(ctx context.Context, currentHash string) error {
// Make sure skia version is at the proper version. This also sets config.Common.SkiaVersion.
if err := download_skia.AtRevision(ctx, currentHash, config.Common.SkiaRoot, &config.Common, false); err != nil {
return fmt.Errorf("Could not update Skia to current version %s: %s", currentHash, err)
}
if err := v.gcsLoader.LoadFreshFromGoogleStorage(); err != nil {
return fmt.Errorf("Had problems fetching new fuzzes from GCS: %s", err)
}
v.syncer.Refresh()
return nil
}
// UpdateVersionToFuzz creates a pending version file and then a work files for each of the
// backends. When the fuzzer backends finish their roll duties, they will remove their
// respective "working" files, indicating they are done.
func UpdateVersionToFuzz(storageClient storage.FuzzerGCSClient, backendWorkers []string, version string) error {
newVersionFile := fmt.Sprintf("skia_version/pending/%s", version)
if err := storageClient.SetFileContents(context.Background(), newVersionFile, gcs.FILE_WRITE_OPTS_TEXT, []byte(version)); err != nil {
return fmt.Errorf("Could not set pending version: %s", err)
}
for _, bw := range backendWorkers {
workFile := fmt.Sprintf("skia_version/pending/working_%s", bw)
if err := storageClient.SetFileContents(context.Background(), workFile, gcs.FILE_WRITE_OPTS_TEXT, []byte(workFile)); err != nil {
sklog.Warningf("Error writing to %s to signal worker %s. Continuing anyway. %s", workFile, bw, err)
}
}
sklog.Infof("%s has been made and %d backend workers notified. They will pick up the change and start working.\n", newVersionFile, len(backendWorkers))
return nil
}