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.core.body.ft.servers.resource;
00032
00033 import java.rmi.RemoteException;
00034 import java.util.ArrayList;
00035 import java.util.Vector;
00036
00037 import org.apache.log4j.Logger;
00038 import org.objectweb.proactive.core.ProActiveException;
00039 import org.objectweb.proactive.core.body.ft.servers.FTServer;
00040 import org.objectweb.proactive.core.node.Node;
00041 import org.objectweb.proactive.core.node.NodeException;
00042 import org.objectweb.proactive.core.util.log.Loggers;
00043 import org.objectweb.proactive.core.util.log.ProActiveLogger;
00044 import org.objectweb.proactive.p2p.service.P2PService;
00045 import org.objectweb.proactive.p2p.service.StartP2PService;
00046 import org.objectweb.proactive.p2p.service.node.P2PNodeLookup;
00047 import org.objectweb.proactive.p2p.service.util.P2PConstants;
00048
00049
00054 public class ResourceServerImpl implements ResourceServer {
00055
00056 protected static Logger logger = ProActiveLogger.getLogger(Loggers.FAULT_TOLERANCE);
00057
00058
00059 private FTServer server;
00060
00061
00062 private ArrayList freeNodes;
00063
00064
00065 private P2PService serviceP2P;
00066
00067
00068 private int nodeCounter;
00069
00070 public ResourceServerImpl(FTServer server) {
00071 this.server = server;
00072 this.freeNodes = new ArrayList();
00073 this.nodeCounter = 0;
00074 }
00075
00076 public ResourceServerImpl(FTServer server, String p2pServerURL) {
00077 this(server);
00078 try {
00079 Vector v = new Vector(1);
00080 v.add(p2pServerURL);
00081 StartP2PService startServiceP2P = new StartP2PService(v);
00082 System.setProperty(P2PConstants.PROPERTY_PORT, "2603");
00083 startServiceP2P.start();
00084 this.serviceP2P = startServiceP2P.getP2PService();
00085 logger.info("[RESOURCE] Running on p2p network");
00086 } catch (ProActiveException e) {
00087 logger.error("**ERROR** Unable to reach p2p network");
00088 e.printStackTrace();
00089 }
00090 }
00091
00095 public void addFreeNode(Node n) throws RemoteException {
00096 logger.info("[RESSOURCE] A node is added : " +
00097 n.getNodeInformation().getURL());
00098 this.freeNodes.add(n);
00099 }
00100
00104 public Node getFreeNode() throws RemoteException {
00105 this.nodeCounter++;
00106 Node n = null;
00107 if (this.freeNodes.isEmpty()) {
00108
00109 if (this.serviceP2P != null) {
00110 P2PNodeLookup p2pNodeLookup = this.serviceP2P.getNodes(1, "FT",
00111 "1");
00112 n = (Node) ((p2pNodeLookup.getNodes(30000)).firstElement());
00113 } else {
00114 logger.error(
00115 "[RESSOURCE] **ERROR** There is no resource nodes !");
00116 return null;
00117 }
00118 } else {
00119 n = (Node) (this.freeNodes.get(nodeCounter % (this.freeNodes.size())));
00120 }
00121 try {
00122
00123 n.getNumberOfActiveObjects();
00124 } catch (NodeException e) {
00125
00126 logger.info("[RESSOURCE] An unreachable node is removed.");
00127 this.freeNodes.remove(n);
00128 this.nodeCounter = 0;
00129 n = getFreeNode();
00130 }
00131 logger.info("[RESSOURCE] Return a node : " +
00132 n.getNodeInformation().getURL());
00133 return n;
00134 }
00135
00139 public void initialize() throws RemoteException {
00140 this.freeNodes = new ArrayList();
00141 this.nodeCounter = 0;
00142 }
00143 }