/* * LoadBalanceManager.java * * Load Balance Manager data and operations for a greedy selection 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 firstServer = 0; // first min server int server[]; // server reqeust count int managerType; // LBM type, 0 = greedy, 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 * * If manager type is random * then randomly select a server * else select server with greedy selection */ int nextServer() { int nextServer; if ( managerType == 1 ) { // random manager nextServer = Math.abs( randNumber.nextInt() ) % serverCount; server[nextServer]++; return( nextServer ); } // greedy manager nextServer = firstServer % server.length; int min = 999999; int minServer = nextServer; int i = 0; // for ( int i = 0; i < server.length; i++ ) { while ( i++ < server.length ) { if ( server[nextServer] < min ) { min = server[nextServer]; minServer = nextServer; } nextServer++; nextServer %= server.length; } server[ minServer ]++; firstServer++; return( minServer ); } }