mirror of
https://github.com/ansible/awx.git
synced 2026-02-21 13:10:11 -03:30
Merge pull request #2827 from jakemcdermott/job-results/performance-testing
performance / ux scrolling fixes for higher volume jobs
This commit is contained in:
@@ -15,6 +15,7 @@ export const JOB_STATUS_FINISHED = JOB_STATUS_COMPLETE.concat(JOB_STATUS_INCOMPL
|
|||||||
|
|
||||||
export const OUTPUT_ELEMENT_CONTAINER = '.at-Stdout-container';
|
export const OUTPUT_ELEMENT_CONTAINER = '.at-Stdout-container';
|
||||||
export const OUTPUT_ELEMENT_TBODY = '#atStdoutResultTable';
|
export const OUTPUT_ELEMENT_TBODY = '#atStdoutResultTable';
|
||||||
|
export const OUTPUT_ELEMENT_LAST = '#atStdoutMenuLast';
|
||||||
export const OUTPUT_MAX_LAG = 120;
|
export const OUTPUT_MAX_LAG = 120;
|
||||||
export const OUTPUT_ORDER_BY = 'counter';
|
export const OUTPUT_ORDER_BY = 'counter';
|
||||||
export const OUTPUT_PAGE_CACHE = true;
|
export const OUTPUT_PAGE_CACHE = true;
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
import {
|
import {
|
||||||
EVENT_START_PLAY,
|
EVENT_START_PLAY,
|
||||||
EVENT_START_TASK,
|
EVENT_START_TASK,
|
||||||
|
OUTPUT_ELEMENT_LAST,
|
||||||
OUTPUT_PAGE_SIZE,
|
OUTPUT_PAGE_SIZE,
|
||||||
} from './constants';
|
} from './constants';
|
||||||
|
|
||||||
@@ -234,6 +235,9 @@ function stopFollowing () {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
scroll.unlock();
|
||||||
|
scroll.unhide();
|
||||||
|
|
||||||
vm.isFollowing = false;
|
vm.isFollowing = false;
|
||||||
vm.followTooltip = vm.strings.get('tooltips.MENU_LAST');
|
vm.followTooltip = vm.strings.get('tooltips.MENU_LAST');
|
||||||
}
|
}
|
||||||
@@ -482,10 +486,31 @@ function OutputIndexController (
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let showFollowTip = true;
|
||||||
|
const rates = [];
|
||||||
stream.init({
|
stream.init({
|
||||||
bufferAdd,
|
bufferAdd,
|
||||||
bufferEmpty,
|
bufferEmpty,
|
||||||
onFrames,
|
onFrames,
|
||||||
|
onFrameRate (rate) {
|
||||||
|
rates.push(rate);
|
||||||
|
rates.splice(0, rates.length - 5);
|
||||||
|
|
||||||
|
if (rates.every(value => value === 1)) {
|
||||||
|
scroll.unlock();
|
||||||
|
scroll.unhide();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rate > 1 && vm.isFollowing) {
|
||||||
|
scroll.lock();
|
||||||
|
scroll.hide();
|
||||||
|
|
||||||
|
if (showFollowTip) {
|
||||||
|
showFollowTip = false;
|
||||||
|
$(OUTPUT_ELEMENT_LAST).trigger('mouseenter');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
onStop () {
|
onStop () {
|
||||||
lockFollow = true;
|
lockFollow = true;
|
||||||
stopFollowing();
|
stopFollowing();
|
||||||
@@ -493,7 +518,8 @@ function OutputIndexController (
|
|||||||
status.updateStats();
|
status.updateStats();
|
||||||
status.dispatch();
|
status.dispatch();
|
||||||
status.sync();
|
status.sync();
|
||||||
scroll.stop();
|
scroll.unlock();
|
||||||
|
scroll.unhide();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -533,3 +559,4 @@ OutputIndexController.$inject = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
module.exports = OutputIndexController;
|
module.exports = OutputIndexController;
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
<div class="pull-right" ng-click="vm.menu.last()">
|
<div class="pull-right" ng-click="vm.menu.last()">
|
||||||
<i class="at-Stdout-menuIcon--lg fa fa-angle-double-down"
|
<i class="at-Stdout-menuIcon--lg fa fa-angle-double-down"
|
||||||
ng-class="{ 'at-Stdout-menuIcon--active': vm.isFollowing }"
|
ng-class="{ 'at-Stdout-menuIcon--active': vm.isFollowing }"
|
||||||
|
id="atStdoutMenuLast"
|
||||||
data-placement="top"
|
data-placement="top"
|
||||||
data-trigger="hover"
|
data-trigger="hover"
|
||||||
data-tip-watch="vm.followTooltip"
|
data-tip-watch="vm.followTooltip"
|
||||||
|
|||||||
@@ -5,8 +5,6 @@ import {
|
|||||||
OUTPUT_SCROLL_THRESHOLD,
|
OUTPUT_SCROLL_THRESHOLD,
|
||||||
} from './constants';
|
} from './constants';
|
||||||
|
|
||||||
const MAX_THRASH = 20;
|
|
||||||
|
|
||||||
function JobScrollService ($q, $timeout) {
|
function JobScrollService ($q, $timeout) {
|
||||||
this.init = ({ next, previous, onThresholdLeave }) => {
|
this.init = ({ next, previous, onThresholdLeave }) => {
|
||||||
this.el = $(OUTPUT_ELEMENT_CONTAINER);
|
this.el = $(OUTPUT_ELEMENT_CONTAINER);
|
||||||
@@ -33,7 +31,6 @@ function JobScrollService ($q, $timeout) {
|
|||||||
paused: false,
|
paused: false,
|
||||||
locked: false,
|
locked: false,
|
||||||
hover: false,
|
hover: false,
|
||||||
running: true,
|
|
||||||
thrash: 0,
|
thrash: 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -44,13 +41,6 @@ function JobScrollService ($q, $timeout) {
|
|||||||
|
|
||||||
this.onMouseEnter = () => {
|
this.onMouseEnter = () => {
|
||||||
this.state.hover = true;
|
this.state.hover = true;
|
||||||
|
|
||||||
if (this.state.thrash >= MAX_THRASH) {
|
|
||||||
this.state.thrash = MAX_THRASH - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.unlock();
|
|
||||||
this.unhide();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
this.onMouseLeave = () => {
|
this.onMouseLeave = () => {
|
||||||
@@ -62,23 +52,6 @@ function JobScrollService ($q, $timeout) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.state.thrash > 0) {
|
|
||||||
if (this.isLocked() || this.state.hover) {
|
|
||||||
this.state.thrash--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!this.state.hover) {
|
|
||||||
this.state.thrash++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.state.thrash >= MAX_THRASH) {
|
|
||||||
if (this.isRunning()) {
|
|
||||||
this.lock();
|
|
||||||
this.hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.isLocked()) {
|
if (this.isLocked()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -195,16 +168,6 @@ function JobScrollService ($q, $timeout) {
|
|||||||
this.setScrollPosition(this.getScrollHeight());
|
this.setScrollPosition(this.getScrollHeight());
|
||||||
};
|
};
|
||||||
|
|
||||||
this.start = () => {
|
|
||||||
this.state.running = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.stop = () => {
|
|
||||||
this.unlock();
|
|
||||||
this.unhide();
|
|
||||||
this.state.running = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
this.lock = () => {
|
this.lock = () => {
|
||||||
this.state.locked = true;
|
this.state.locked = true;
|
||||||
};
|
};
|
||||||
@@ -256,7 +219,6 @@ function JobScrollService ($q, $timeout) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
this.isPaused = () => this.state.paused;
|
this.isPaused = () => this.state.paused;
|
||||||
this.isRunning = () => this.state.running;
|
|
||||||
this.isLocked = () => this.state.locked;
|
this.isLocked = () => this.state.locked;
|
||||||
this.isMissing = () => $(OUTPUT_ELEMENT_TBODY)[0].clientHeight < this.getViewableHeight();
|
this.isMissing = () => $(OUTPUT_ELEMENT_TBODY)[0].clientHeight < this.getViewableHeight();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,11 +6,12 @@ import {
|
|||||||
} from './constants';
|
} from './constants';
|
||||||
|
|
||||||
function OutputStream ($q) {
|
function OutputStream ($q) {
|
||||||
this.init = ({ bufferAdd, bufferEmpty, onFrames, onStop }) => {
|
this.init = ({ bufferAdd, bufferEmpty, onFrames, onFrameRate, onStop }) => {
|
||||||
this.hooks = {
|
this.hooks = {
|
||||||
bufferAdd,
|
bufferAdd,
|
||||||
bufferEmpty,
|
bufferEmpty,
|
||||||
onFrames,
|
onFrames,
|
||||||
|
onFrameRate,
|
||||||
onStop,
|
onStop,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -53,6 +54,7 @@ function OutputStream ($q) {
|
|||||||
const boundedIndex = Math.min(this.factors.length - 1, index);
|
const boundedIndex = Math.min(this.factors.length - 1, index);
|
||||||
|
|
||||||
this.framesPerRender = this.factors[boundedIndex];
|
this.framesPerRender = this.factors[boundedIndex];
|
||||||
|
this.hooks.onFrameRate(this.framesPerRender);
|
||||||
};
|
};
|
||||||
|
|
||||||
this.setMissingCounterThreshold = counter => {
|
this.setMissingCounterThreshold = counter => {
|
||||||
@@ -111,7 +113,8 @@ function OutputStream ($q) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const isReady = maxReady && (this.state.ending ||
|
const isReady = maxReady && (this.state.ending ||
|
||||||
(maxReady - minReady) % this.framesPerRender === 0);
|
count % this.framesPerRender === 0 ||
|
||||||
|
count < OUTPUT_PAGE_SIZE && (maxReady - minReady) % this.framesPerRender === 0);
|
||||||
|
|
||||||
if (!isReady) {
|
if (!isReady) {
|
||||||
return $q.resolve();
|
return $q.resolve();
|
||||||
|
|||||||
Reference in New Issue
Block a user