Skip to content

Commit 8376a0b

Browse files
SeawardTSkCQ
authored andcommitted
Perf: Add auto-refresh in dev mode
Adds a mechanism for the frontend to automatically refresh when the backend server restarts in dev mode. - Adds `/_/dev/version` endpoint to backend. - Adds `dev_mode` flag to `SkPerfConfig`. - Implements polling in `perf-scaffold-sk` to check for version changes in dev mode. - Updates demos and tests to include `dev_mode: false` in mock config. How to run locally: 1. Run ./perf/run_perfserver.sh --instance chrome 2. Open http://<hostname>:8002 3. Edit files in perf/ (e.g. perf/modules/perf-scaffold-sk/perf-scaffold-sk.ts) 4. The server will rebuild and restart automatically. 5. The browser page will refresh automatically once the server is back up. Change-Id: I0639f3a92525a029a42a0a1e5b264fa2468593fb Reviewed-on: https://skia-review.googlesource.com/c/buildbot/+/1101558 Reviewed-by: Farid (Mojtaba) Faridzad <[email protected]> Commit-Queue: Tony Seaward <[email protected]>
1 parent 9069ce4 commit 8376a0b

32 files changed

+263
-32
lines changed

perf/go/frontend/BUILD.bazel

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ go_library(
99
],
1010
data = glob(["testdata/**"]),
1111
embedsrcs = [
12-
"googleanalytics.html",
1312
"cookieconsent.html",
13+
"googleanalytics.html",
1414
],
1515
importpath = "go.skia.org/infra/perf/go/frontend",
1616
visibility = ["//visibility:public"],

perf/go/frontend/frontend.go

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ var (
116116
// of the body element otherwise.
117117
//go:embed cookieconsent.html
118118
cookieConsentSnippet string
119+
120+
serverStartupTime = time.Now().Unix()
119121
)
120122

121123
// Frontend is the server for the Perf web UI.
@@ -304,6 +306,7 @@ type SkPerfConfig struct {
304306
AlwaysShowCommitInfo bool `json:"always_show_commit_info"` // Boolean to display commit author and hash.
305307
AppVersion string `json:"app_version"` // The git revision of the buildbot repo this instance was built from.
306308
EnableV2UI bool `json:"enable_v2_ui"` // True if V2 UI can be toggled.
309+
DevMode bool `json:"dev_mode"`
307310
}
308311

309312
// getPageContext returns the value of `window.perf` serialized as JSON.
@@ -313,6 +316,9 @@ type SkPerfConfig struct {
313316
// expansion correctly renders this as executable JS.
314317
func (f *Frontend) getPageContext() (template.JS, error) {
315318
imageTag := os.Getenv("IMAGE_TAG")
319+
if f.flags.DevMode {
320+
imageTag = fmt.Sprintf("Dev Server: %s", time.Unix(serverStartupTime, 0).Format("06/01/02 3:04 PM MST"))
321+
}
316322

317323
pc := SkPerfConfig{
318324
InstanceUrl: config.Config.URL,
@@ -349,6 +355,7 @@ func (f *Frontend) getPageContext() (template.JS, error) {
349355
ShowBisectBtn: config.Config.ShowBisectBtn,
350356
AppVersion: f.appVersion,
351357
EnableV2UI: config.Config.EnableV2UI,
358+
DevMode: f.flags.DevMode,
352359
}
353360

354361
var buff bytes.Buffer
@@ -975,7 +982,13 @@ func (f *Frontend) feTelemetryHandler(w http.ResponseWriter, r *http.Request) {
975982
func (f *Frontend) makeDistHandler() func(http.ResponseWriter, *http.Request) {
976983
fileServer := http.StripPrefix("/dist", http.FileServer(f.distFileSystem))
977984
return func(w http.ResponseWriter, r *http.Request) {
978-
w.Header().Add("Cache-Control", "max-age=300")
985+
if f.flags.DevMode {
986+
w.Header().Set("Cache-Control", "no-store, no-cache, must-revalidate, proxy-revalidate")
987+
w.Header().Set("Pragma", "no-cache")
988+
w.Header().Set("Expires", "0")
989+
} else {
990+
w.Header().Add("Cache-Control", "max-age=300")
991+
}
979992
fileServer.ServeHTTP(w, r)
980993
}
981994
}
@@ -1103,6 +1116,10 @@ func (f *Frontend) GetHandler(allowedHosts []string) http.Handler {
11031116
router.Get("/_/revision", f.revisionHandler)
11041117
router.Get("/_/json/", Proxy_GetHandler)
11051118

1119+
if f.flags.DevMode {
1120+
router.Get("/_/dev/version", f.devVersionHandler)
1121+
}
1122+
11061123
return router
11071124
}
11081125

@@ -1159,3 +1176,14 @@ func (f *Frontend) Serve() {
11591176
}
11601177
sklog.Fatal(server.ListenAndServe())
11611178
}
1179+
1180+
func (f *Frontend) devVersionHandler(w http.ResponseWriter, r *http.Request) {
1181+
w.Header().Set("Content-Type", "application/json")
1182+
if err := json.NewEncoder(w).Encode(struct {
1183+
Version string `json:"version"`
1184+
}{
1185+
Version: f.appVersion,
1186+
}); err != nil {
1187+
httputils.ReportError(w, err, "Failed to encode version", http.StatusInternalServerError)
1188+
}
1189+
}

perf/go/frontend/frontend_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,3 +288,17 @@ func TestFrontend_GetPageContext_InstanceName(t *testing.T) {
288288
// The backend just passes it through.
289289
require.Contains(t, string(ctx), "\"instance_name\": \"this-is-a-long-instance-name-that-exceeds-the-limit-of-64-chars-by-a-bit\"")
290290
}
291+
292+
func TestFrontend_devVersionHandler_ReturnsVersion(t *testing.T) {
293+
f := &Frontend{
294+
appVersion: "test-version-123",
295+
}
296+
297+
r := httptest.NewRequest("GET", "/_/dev/version", nil)
298+
w := httptest.NewRecorder()
299+
300+
f.devVersionHandler(w, r)
301+
302+
require.Equal(t, http.StatusOK, w.Result().StatusCode)
303+
require.JSONEq(t, `{"version": "test-version-123"}`, w.Body.String())
304+
}

perf/modules/anomalies-table-sk/anomalies-table-sk-demo.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import fetchMock from 'fetch-mock';
66
import { anomaly_table, GROUP_REPORT_RESPONSE, GROUP_REPORT_RESPONSE_WITH_SID } from './test_data';
77

88
window.perf = {
9+
dev_mode: false,
910
instance_url: '',
1011
instance_name: 'chrome-perf-demo',
1112
header_image_url: '',

perf/modules/anomalies-table-sk/anomalies-table-sk_test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ describe('anomalies-table-sk', () => {
1414
let element: AnomaliesTableSk;
1515
beforeEach(() => {
1616
window.perf = {
17+
dev_mode: false,
1718
instance_url: '',
1819
instance_name: 'chrome-perf-test',
1920
header_image_url: '',

perf/modules/anomaly-sk/anomaly-sk-demo.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Anomaly } from '../json';
55
import { AnomalySk } from './anomaly-sk';
66

77
window.perf = {
8+
dev_mode: false,
89
instance_url: '',
910
instance_name: 'chrome-perf-demo',
1011
header_image_url: '',

perf/modules/anomaly-sk/anomaly-sk_test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ describe('formatRevisionRange', () => {
186186
anomalySk.anomaly = dummyAnomaly();
187187

188188
window.perf = {
189+
dev_mode: false,
189190
instance_url: '',
190191
instance_name: 'chrome-perf-test',
191192
header_image_url: '',

perf/modules/chart-tooltip-sk/chart-tooltip-sk-demo.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { $$ } from '../../../infra-sk/modules/dom';
55

66
// Mock data for the tooltip.
77
window.perf = {
8+
dev_mode: false,
89
instance_url: '',
910
instance_name: 'chrome-perf-demo',
1011
header_image_url: '',

perf/modules/chart-tooltip-sk/chart-tooltip-sk_test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ describe('chart-tooltip-sk', () => {
1717
// });
1818

1919
window.perf = {
20+
dev_mode: false,
2021
instance_url: '',
2122
instance_name: 'chrome-perf-test',
2223
header_image_url: '',

perf/modules/cluster-page-sk/cluster-page-sk-demo.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ customElements.whenDefined('cluster-page-sk').then(() => {
105105
});
106106

107107
window.perf = {
108+
dev_mode: false,
108109
instance_url: '',
109110
instance_name: 'chrome-perf-demo',
110111
header_image_url: '',

0 commit comments

Comments
 (0)