blob: 530c51858e424bdef5a1eec1e8d552c21597c09e [file] [log] [blame]
// warmer makes sure we've pre-warmed the cache for normal queries.
//
// This is a quick fix until filediffstore does full NxM diffs for every
// untriaged digest by default.
package warmer
import (
"go.skia.org/infra/go/sklog"
"go.skia.org/infra/go/tiling"
"go.skia.org/infra/go/timer"
"go.skia.org/infra/go/util"
"go.skia.org/infra/golden/go/diff"
"go.skia.org/infra/golden/go/digesttools"
"go.skia.org/infra/golden/go/storage"
"go.skia.org/infra/golden/go/summary"
"go.skia.org/infra/golden/go/tally"
"go.skia.org/infra/golden/go/types"
)
// TODO(stephana): This should be folded into the rewritten FileDiffStore.
// Warmer continously prefetches images and calculates diffs that are likely to
// be requested by the front-end.
type Warmer struct {
storages *storage.Storage
}
// New creates an new instance of warmer.
func New(storages *storage.Storage) *Warmer {
return &Warmer{
storages: storages,
}
}
// Run prefetches the digests in tile and calculates differences we'll need.
func (w *Warmer) Run(tile *tiling.Tile, summaries *summary.Summaries, tallies *tally.Tallies) {
exp, err := w.storages.ExpectationsStore.Get()
if err != nil {
sklog.Errorf("warmer: Failed to get expectations: %s", err)
}
t := timer.New("warmer one loop")
for test, sum := range summaries.Get() {
for _, digest := range sum.UntHashes {
t := tallies.ByTest()[test]
if t != nil {
// Calculate the closest digest for the side effect of filling in the filediffstore cache.
digesttools.ClosestDigest(test, digest, exp, t, w.storages.DiffStore, types.POSITIVE)
digesttools.ClosestDigest(test, digest, exp, t, w.storages.DiffStore, types.NEGATIVE)
}
}
}
t.Stop()
// Make sure all images are downloaded. This is necessary, because
// the front-end doesn't get URLs (generated via DiffStore.AbsPath)
// which ensures that the image has been downloaded.
// TODO(stephana): Remove this once the new diffstore is in place.
tileLen := tile.LastCommitIndex() + 1
traceDigests := make(util.StringSet, tileLen)
for _, trace := range tile.Traces {
gTrace := trace.(*types.GoldenTrace)
for _, digest := range gTrace.Values {
if digest != types.MISSING_DIGEST {
traceDigests[digest] = true
}
}
}
digests := traceDigests.Keys()
sklog.Infof("FOUND %d digests to fetch.", len(digests))
w.storages.DiffStore.WarmDigests(diff.PRIORITY_BACKGROUND, digests, false)
// TODO(stephana): Add warmer for Tryjob digests.
}