From 3e285d6131b640078fae1517843804f3edc8618e Mon Sep 17 00:00:00 2001 From: wescoeur Date: Wed, 6 Apr 2016 15:24:34 +0200 Subject: [PATCH] Search destination host per pool. (Performance mode) --- packages/xo-server-load-balancer/package.json | 2 +- .../src/performance-plan.js | 32 ++++++++++++++----- packages/xo-server-load-balancer/src/plan.js | 16 ++++------ packages/xo-server-load-balancer/src/utils.js | 13 -------- 4 files changed, 31 insertions(+), 32 deletions(-) diff --git a/packages/xo-server-load-balancer/package.json b/packages/xo-server-load-balancer/package.json index 204213c22..0e5091f7e 100644 --- a/packages/xo-server-load-balancer/package.json +++ b/packages/xo-server-load-balancer/package.json @@ -34,8 +34,8 @@ "cron": "^1.1.0", "event-to-promise": "^0.6.0", "lodash.clonedeep": "^4.3.1", - "lodash.differenceby": "^4.2.1", "lodash.filter": "^4.2.0", + "lodash.find": "^4.3.0", "lodash.includes": "^4.1.0", "lodash.intersection": "^4.1.0", "lodash.map": "^4.2.0", diff --git a/packages/xo-server-load-balancer/src/performance-plan.js b/packages/xo-server-load-balancer/src/performance-plan.js index bbf4103b5..981a2e627 100644 --- a/packages/xo-server-load-balancer/src/performance-plan.js +++ b/packages/xo-server-load-balancer/src/performance-plan.js @@ -1,10 +1,21 @@ import filter from 'lodash.filter' +import find from 'lodash.find' import Plan from './plan' -import { - debug, - searchObject -} from './utils' +import { debug } from './utils' + +// Compare a list of objects and give the best. +function searchBestObject (objects, fun) { + let object = objects[0] + + for (let i = 1; i < objects.length; i++) { + if (fun(object, objects[i]) > 0) { + object = objects[i] + } + } + + return object +} // =================================================================== @@ -74,11 +85,16 @@ export default class PerformancePlan extends Plan { const xapiSrc = this.xo.getXapi(exceededHost) let optimizationsCount = 0 + const searchFunction = (a, b) => hostsAverages[b.id].cpu - hostsAverages[a.id].cpu + for (const vm of vms) { - // Search host with lower cpu usage. - const destination = searchObject(hosts, (a, b) => - hostsAverages[b.id].cpu - hostsAverages[a.id].cpu - ) + // Search host with lower cpu usage in the same pool first. In other pool if necessary. + let destination = searchBestObject(find(hosts, host => host.$poolId === vm.$poolId), searchFunction) + + if (!destination) { + destination = searchBestObject(hosts, searchFunction) + } + const destinationAverages = hostsAverages[destination.id] const vmAverages = vmsAverages[vm.id] diff --git a/packages/xo-server-load-balancer/src/plan.js b/packages/xo-server-load-balancer/src/plan.js index d4b240fe1..2f24b0ce9 100644 --- a/packages/xo-server-load-balancer/src/plan.js +++ b/packages/xo-server-load-balancer/src/plan.js @@ -1,4 +1,3 @@ -import differenceBy from 'lodash.differenceby' import filter from 'lodash.filter' import includes from 'lodash.includes' import { default as mapToArray } from 'lodash.map' @@ -188,15 +187,12 @@ export default class Plan { // Compute hosts for each pool. They can change over time. _getHosts () { - return differenceBy( - filter(this.xo.getObjects(), object => { - object.type === 'host' && - includes(this._poolIds, object.$poolId) && - object.power_state !== 'Halted' - }), - this._excludedHosts, - val => val.id || val - ) + return filter(this.xo.getObjects(), object => ( + object.type === 'host' && + includes(this._poolIds, object.$poolId) && + object.power_state !== 'Halted' && + !includes(this._excludedHosts, object.id) + )) } async _getVms (hostId) { diff --git a/packages/xo-server-load-balancer/src/utils.js b/packages/xo-server-load-balancer/src/utils.js index d2eca97e1..f7894a639 100644 --- a/packages/xo-server-load-balancer/src/utils.js +++ b/packages/xo-server-load-balancer/src/utils.js @@ -11,16 +11,3 @@ export const EXECUTION_DELAY = 1 export const debug = LOAD_BALANCER_DEBUG ? str => console.log(`[load-balancer]${str}`) : noop - -// Compare a list of objects and give the best. -export function searchObject (objects, fun) { - let object = objects[0] - - for (let i = 1; i < objects.length; i++) { - if (fun(object, objects[i]) > 0) { - object = objects[i] - } - } - - return object -}