Commit b57e8a4f authored by Clement Ho's avatar Clement Ho Committed by Ruben Davila

Merge branch '28212-avoid-dos-on-build-trace' into 'master'

Replace setInterval with setTimeout to prevent highly frequent requests

Closes #28212

See merge request !9271
parent 39569ee9
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
var DOWN_BUILD_TRACE = '#down-build-trace'; var DOWN_BUILD_TRACE = '#down-build-trace';
this.Build = (function() { this.Build = (function() {
Build.interval = null; Build.timeout = null;
Build.state = null; Build.state = null;
...@@ -31,7 +31,7 @@ ...@@ -31,7 +31,7 @@
this.$scrollBottomBtn = $('#scroll-bottom'); this.$scrollBottomBtn = $('#scroll-bottom');
this.$buildRefreshAnimation = $('.js-build-refresh'); this.$buildRefreshAnimation = $('.js-build-refresh');
clearInterval(Build.interval); clearTimeout(Build.timeout);
// Init breakpoint checker // Init breakpoint checker
this.bp = Breakpoints.get(); this.bp = Breakpoints.get();
...@@ -52,17 +52,7 @@ ...@@ -52,17 +52,7 @@
this.getInitialBuildTrace(); this.getInitialBuildTrace();
this.initScrollButtonAffix(); this.initScrollButtonAffix();
} }
if (this.buildStatus === "running" || this.buildStatus === "pending") { this.invokeBuildTrace();
Build.interval = setInterval((function(_this) {
// Check for new build output if user still watching build page
// Only valid for runnig build when output changes during time
return function() {
if (_this.location() === _this.pageUrl) {
return _this.getBuildTrace();
}
};
})(this), 4000);
}
} }
Build.prototype.initSidebar = function() { Build.prototype.initSidebar = function() {
...@@ -83,6 +73,22 @@ ...@@ -83,6 +73,22 @@
return window.location.href.split("#")[0]; return window.location.href.split("#")[0];
}; };
Build.prototype.invokeBuildTrace = function() {
var continueRefreshStatuses = ['running', 'pending'];
// Continue to update build trace when build is running or pending
if (continueRefreshStatuses.indexOf(this.buildStatus) !== -1) {
// Check for new build output if user still watching build page
// Only valid for runnig build when output changes during time
Build.timeout = setTimeout((function(_this) {
return function() {
if (_this.location() === _this.pageUrl) {
return _this.getBuildTrace();
}
};
})(this), 4000);
}
};
Build.prototype.getInitialBuildTrace = function() { Build.prototype.getInitialBuildTrace = function() {
var removeRefreshStatuses = ['success', 'failed', 'canceled', 'skipped']; var removeRefreshStatuses = ['success', 'failed', 'canceled', 'skipped'];
...@@ -113,6 +119,7 @@ ...@@ -113,6 +119,7 @@
if (log.state) { if (log.state) {
_this.state = log.state; _this.state = log.state;
} }
_this.invokeBuildTrace();
if (log.status === "running") { if (log.status === "running") {
if (log.append) { if (log.append) {
$('.js-build-output').append(log.html); $('.js-build-output').append(log.html);
......
---
title: Replace setInterval with setTimeout to prevent highly frequent requests
merge_request: 9271
author: Takuya Noguchi
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment