/* * LoadBalanceManager.java * * Load Balance Manager data and operations for random selection of * a subset of the set of servers. * * Created by: Arthur L. Blais * Visteon/Ford Microelectronics Inc. * Colorado Springs, CO * * Date: Fri Sep 24 08:43:13 MDT 1999 * * 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 serverCount; // total number of servers int server[]; // server reqeust count int managerType; // LBM type 0 = subset, 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; serverCount = s; managerType = t; server = new int[ serverCount ]; for ( int i = 0; i < serverCount; i++ ) { server[i] = 0; } randNumber = new Random( seed ); } /** * getId */ int getId() { return id; } /** * requestComplete */ void requestComplete( int s ) { server[s]--; } /** * nextServer * * Greedy selection of the server with the lowest load from a * random subset of the set of servers * */ int nextServer() { if ( serverCount == 1 ) { server[0]++; return 0; } int nextServer; if ( managerType == 1 ) { // random manager nextServer = Math.abs( randNumber.nextInt() ) % serverCount; server[nextServer]++; return( nextServer ); } int s0 = Math.abs( randNumber.nextInt() ) % serverCount; int s1 = Math.abs( randNumber.nextInt() ) % serverCount; while ( s0 == s1 ) { s1 = Math.abs( randNumber.nextInt() ) % serverCount; } if ( server[ s0 ] <= server[ s1 ] ) { nextServer = s0; } else { nextServer = s1; } server[nextServer]++; return( nextServer ); } }