/* * LoadBalanceManager.java * * Load Balance Manager data and operations for stochastic selection * of servers. * * Created by: Arthur L. Blais * Visteon/Ford Microelectronics Inc. * Colorado Springs, CO * * Date: Fri Jan 7 11:02:31 MST 2000 * Wed Mar 29 07:21:05 MST 2000: add random selection for adversarial tests * * **************************************************************************** * * Class Methods * * **************************************************************************** */ import java.util.Random; public class LoadBalanceManager { int id; // id number int server[]; // request count for each server int lastServer = 0; // last server round robin selection int requestCount = 0; // current total request count int serverCount; // number of servers int managerType; // LBM type, 0 = stochastic,1 = random // Pseudo-Random Variate Seeds private static long seed = 98391; // random number instances private static Random randNumber; // = new Random( seed ); public LoadBalanceManager( int n, int s, int t ) { id = n; server = new int[ s ]; serverCount = s; managerType = t; for ( int i = 0; i < server.length; i++ ) { server[i] = 0; } randNumber = new Random( seed + id ); } /** * getId */ int getId() { return id; } /** * requestComplete */ void requestComplete( int s ) { requestCount--; server[s]--; } /** * nextServer * * selects a server to submit a request to * if request count is zero return the first server * else select a server by calculating a probability distribution * based on the current number of server reqeusts counted * (selected) by this lbm. */ int nextServer() { int nextServer; if ( managerType == 1 ) { // random manager nextServer = Math.abs( randNumber.nextInt() ) % serverCount; server[nextServer]++; return( nextServer ); } int i; nextServer = 0; long product = 1; long sum = 0; double upperLimit; double randomNumber = randNumber.nextDouble(); long temp[] = new long[ server.length ]; // add one to the each server's totals // and calculate the product for ( i = 0; i < server.length; i++ ) { temp[i] = server[i] + 1; product *= temp[i]; } // divide the product by the temp server count // and sum the new value for ( i = 0; i < server.length; i++ ) { temp[i] = product / temp[i]; sum += temp[i]; } // divide each temp server count by the sum and // find the next server with the random variate i = 0; upperLimit = ( double ) temp[i] / ( double ) sum; while ( upperLimit < randomNumber ) { i++; upperLimit += ( double ) temp[i] / ( double ) sum; } nextServer = i; server[nextServer]++; requestCount++; return( nextServer ); } }