basho-riak-client-covs
Version:
Basho's officially supported NodeJS client for Riak
97 lines (85 loc) • 2.64 kB
JavaScript
/**
*
* Copyright 2014-present Basho Technologies, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
var inherits = require('util').inherits;
var logger = require('winston');
var NodeManager = require('./nodemanager');
/**
* @module Core
*/
/**
* A NodeManager that can be used by RiakCluster.
*
* This NodeManager does a least-commands-executing selection of RiakNodes.
*
* @class LeastExecutingNodeManager
* @param {Boolean} shuffle Shuffle nodes that have same execution count.
* @constructor
* @extends NodeManager
*/
function LeastExecutingNodeManager(shuffle) {
NodeManager.call(this, 'LeastExecutingNodeManager');
this._shuffle = shuffle;
}
inherits(LeastExecutingNodeManager, NodeManager);
LeastExecutingNodeManager.prototype.executeOnNode = function(nodes, command, previous) {
if (nodes.length === 0) {
logger.error("[LeastExecutingNodeManager] zero nodes for execution of command %s", command.name);
return false;
}
var n = [];
Array.prototype.push.apply(n, nodes);
n.sort(function (a, b) {
return a.executeCount - b.executeCount;
});
var i = 0;
if (this._shuffle) {
var j = 0;
for (i = 0; i < n.length - 1; i++) {
j = i + 1;
if (n[j].executeCount > n[i].executeCount) {
break;
}
}
if (j > 1) {
var s = shuffleArray(n.slice(0, j));
n = Array.prototype.concat(s, n.slice(j));
}
}
var executing = false;
for (i = 0; i < n.length; i++) {
executing = this.tryExecute(n[i], command);
if (executing) {
break;
}
}
return executing;
};
/**
* Randomize array element order in-place.
* Using Durstenfeld shuffle algorithm.
* http://stackoverflow.com/a/12646864
*/
function shuffleArray(array) {
for (var i = array.length - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return array;
}
module.exports = LeastExecutingNodeManager;