00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 package org.objectweb.proactive.loadbalancing;
00032
00033 import java.util.ArrayList;
00034 import java.util.Iterator;
00035 import java.util.Random;
00036 import org.apache.log4j.Logger;
00037 import org.objectweb.proactive.Body;
00038 import org.objectweb.proactive.ProActive;
00039 import org.objectweb.proactive.ProActiveInternalObject;
00040 import org.objectweb.proactive.core.body.BodyMap;
00041 import org.objectweb.proactive.core.body.LocalBodyStore;
00042 import org.objectweb.proactive.core.body.migration.MigrationException;
00043 import org.objectweb.proactive.core.exceptions.NonFunctionalException;
00044 import org.objectweb.proactive.core.node.Node;
00045 import org.objectweb.proactive.core.node.NodeException;
00046 import org.objectweb.proactive.core.node.NodeFactory;
00047 import org.objectweb.proactive.core.util.log.Loggers;
00048 import org.objectweb.proactive.core.util.log.ProActiveLogger;
00049 import org.objectweb.proactive.loadbalancing.metrics.Metric;
00050 import org.objectweb.proactive.loadbalancing.metrics.MetricFactory;
00051
00052
00069 public class LoadBalancer implements ProActiveInternalObject {
00070 public static Logger logger = ProActiveLogger.getLogger(Loggers.LOAD_BALANCING);
00071
00072 protected LoadMonitor lm;
00073 protected Metric metric;
00074 protected Node myNode;
00075 protected ArrayList<LoadBalancer> loadBalancers;
00076
00077 private static final int STEAL = 1;
00078 private static final int BALANCE = 2;
00079
00080 protected String balancerName;
00081 protected Random randomizer;
00082 protected LoadBalancer myThis;
00083 protected InformationRecover informationRecover;
00084
00085
00086 public LoadBalancer(){}
00087
00088 public LoadBalancer(MetricFactory mf){
00089 this.randomizer = new Random();
00090 this.metric = mf.getNewMetric();
00091
00092
00093 }
00094
00095
00096 public void startBalancing() {
00097 internalAction(BALANCE);
00098 }
00099
00100 public void stealWork() {
00101 internalAction(STEAL);
00102 }
00103
00104
00105 public void sendActiveObjectsTo(Node remoteNode, double remoteRanking) {
00106 if (this.metric == null)
00107 return;
00108 if (this.metric.getRanking() < remoteRanking * LoadBalancingConstants.STEAL_FACTOR) {
00109 sendActiveObjectsTo(remoteNode);
00110 }
00111 }
00112
00113 protected void getActiveObjectsFrom (LoadBalancer remoteBalancer, double remoteRanking){
00114 if (this.metric == null)
00115 return;
00116 if (remoteRanking < this.metric.getRanking() * LoadBalancingConstants.BALANCE_FACTOR) {
00117 remoteBalancer.sendActiveObjectsTo(myNode);
00118 }
00119 }
00120
00128 public void sendActiveObjectsTo(Node destNode) {
00129
00130 if (NodeFactory.isNodeLocal(destNode)) {
00131 return;
00132 }
00133
00134 try {
00135
00136 BodyMap knownBodies = LocalBodyStore.getInstance().getLocalBodies();
00137
00138 if (knownBodies.size() < 1) {
00139 return;
00140 }
00141
00142 java.util.Iterator bodiesIterator = knownBodies.bodiesIterator();
00143
00145 int minLength = Integer.MAX_VALUE;
00146 Body minBody = null;
00147 while (bodiesIterator.hasNext()) {
00148 Body activeObjectBody = (Body) bodiesIterator.next();
00149 Object testObject = activeObjectBody.getReifiedObject();
00150
00151
00152 boolean testSerialization = !(testObject instanceof ProActiveInternalObject) && !(testObject instanceof NotLoadBalanceableObject);
00153
00154 if (activeObjectBody.isAlive()) {
00155 if (activeObjectBody.isActive() && testSerialization) {
00156 int aoQueueLenght = activeObjectBody.getRequestQueue()
00157 .size();
00158 if (aoQueueLenght < minLength) {
00159 minLength = aoQueueLenght;
00160 minBody = activeObjectBody;
00161 }
00162 }
00163 }
00164 }
00165
00166
00167 if ((minBody != null) && minBody.isActive()) {
00168
00169
00170
00171
00172 ProActive.migrateTo(minBody, destNode, false);
00173 informationRecover.register(this.getName(),this.metric.getLoad(), destNode.getNodeInformation().getURL(),minBody.getReifiedObject().getClass().getName());
00174 }
00175 } catch (IllegalArgumentException e) {
00176 logger.error("[LoadBalancer] "+e.getLocalizedMessage());
00177 } catch (SecurityException e) {
00178 logger.error("[LoadBalancer] Object doesn't have migrateTo method");
00179 } catch (MigrationException e) {
00180 logger.error("[LoadBalancer] Object can't migrate (?)");
00182 }
00183 }
00184
00185
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258