3 import java.rmi.RemoteException;
4 import java.rmi.server.UnicastRemoteObject;
5 import java.util.ArrayList;
6 import java.util.Vector;
8 import and.Mapping.Algo;
9 import and.Mapping.DefaultMapping;
10 import and.Mapping.GNode;
11 import and.Mapping.GTask;
12 import and.Mapping.Graph;
13 import and.Mapping.Grid;
14 import and.Mapping.LSM;
15 import and.Mapping.Mapping;
16 import and.Mapping.QM;
17 import and.Mapping.Simple;
18 import and.Mapping.Utils;
21 public class JaceSuperNodeServer extends UnicastRemoteObject implements
22 JaceSuperNodeInterface {
23 private static final long serialVersionUID = 1L;
27 private ArrayList<GNode> gnodes = null;
28 private Algo al = null ;
29 private int count = 0 ;
30 // private boolean daemonListChange ;
34 public JaceSuperNodeServer(int timeBeat) throws RemoteException {
37 gnodes = new ArrayList<GNode>() ;
38 // daemonListChange = true ;
41 public int getSuperNodeBeat() throws RemoteException {
45 public Vector<?> sendStub(String IP, int port, JaceSuperNodeInterface stub)
46 throws RemoteException {
47 SuperNodeListe.Instance().addStubOf(IP, port, stub);
48 System.out.println("Added new superNode (" + IP
49 + ") to list and return List");
50 return SuperNodeListe.Instance().getListe();
53 public void updateCountNode(String IP, int nb) throws RemoteException {
54 SuperNodeListe.Instance().modifCountNode(IP, nb);
55 // System.out.println( "SuperNode " + IP + " has registered " + nb +
57 SuperNodeListe.Instance().viewAll();
60 public void sendSurplus(Vector<?> nodes) throws RemoteException {
61 System.out.println("Recieved " + nodes.size() + " nodes");
63 for (int i = 0; i < nodes.size(); i++) {
64 Register.Instance().getListe().add((Node) nodes.elementAt(i));
66 System.out.println("Adding "
67 + ((Node) nodes.elementAt(i)).getName());
70 ((Node) nodes.elementAt(i)).getStub().updateHeart(
71 LocalHost.Instance().getSuperNodeStub());
72 int index = SuperNodeListe.Instance().existSuperNode(
73 LocalHost.Instance().getIP());
74 ((SuperNodeData) SuperNodeListe.Instance().getListe()
76 .setNbOfNodes(Register.Instance().getSize());
77 new ForwardCount().start();
78 } catch (Exception e) {
79 System.out.println("Error changing Server in SendSurplus : "
85 public void setToken() throws RemoteException {
86 System.out.println("I got Token");
88 TokenThread.Instance().setToken();
91 HeartBeatSNode.Instance().getServer().beating(true);
93 System.out.println("Put token to true");
94 } catch (Exception e) {
96 .println("Unable to heartBeat the next SuperNode with the new Token : "
101 public void updateHeart(JaceSuperNodeInterface stub) throws RemoteException {
102 System.out.println("I change to ping a superNode");
104 HeartBeatSNode.Instance().setServer(stub);
107 public synchronized void removeSuperNode(SuperNodeData d)
108 throws RemoteException {
109 SuperNodeListe.Instance().removeSuperNode(d);
112 /****************************************************/
113 /****************************************************/
115 // Register a Daemon in the Register.Instance() of the SuperNode
116 public synchronized void workerRegistering(JaceInterface workerStub,
117 String workerIP, String workerName, int port, GNode g)
118 throws RemoteException {
119 System.out.println("CONNEXION of " + workerName);
122 Node noeud = new Node(workerStub);
123 noeud.setName(workerName);
124 noeud.setIP(workerIP);
125 noeud.setAliveFlag(true);
126 noeud.setAliveTime();
128 noeud.setAppliName(null);
129 noeud.setNbOfBeats(0);
130 noeud.setId( count ) ;
131 noeud.setId( Long.parseLong( workerIP.replace( ".", "" ) ) ) ;
134 g.setId( noeud.getId() ) ;
137 // daemonListChange = true ;
139 // Insert the node in the Register.Instance() of the Super Node
140 Register.Instance().addNode(noeud);
142 // Register.Instance().viewAll() ;
143 // SuperNodeListe.Instance().viewAll() ;
145 // Inform the other superNode and tell them the nb of Daemon I have
147 int index = SuperNodeListe.Instance().existSuperNode(
148 LocalHost.Instance().getIP());
150 ((SuperNodeData) SuperNodeListe.Instance().getListe().get(index))
151 .setNbOfNodes(Register.Instance().getSize());
152 SuperNodeListe.Instance().forwardCountNode();
154 SuperNodeListe.Instance().addGNode( g ) ;
157 /****************************************************/
158 /****************************************************/
160 // HeartBeat that detects if a Daemon is dead or alive
161 public void beating(JaceInterface stub) throws RemoteException {
162 Node noeud = Register.Instance().getNodeOfStub(stub);
165 noeud.setAliveFlag(true);
166 noeud.setAliveTime();
167 noeud.incrementNbOfBeats();
169 // System.out.println( noeud.getName() + " is pinging me" ) ;
171 // System.out.println( noeud.getName() +
172 // ".................. is not in my list" ) ;
176 // HeartBeat that detects if a Super Node is dead or alive
177 public void beating(boolean token) throws RemoteException {
178 ScanThreadSuperNode.Instance().setAliveTime();
179 ScanThreadSuperNode.Instance().setToken(token);
181 // System.out.println( "Super Node is pinging me" ) ;
185 /*********************************/
186 /** Mapping !! Sébastien Miquée **/
187 /*********************************/
189 public Register getRegisterSpawner(String spawnerIP, int nbTasks, Task t,
190 int nbNoeuds, int algo, double paramAlgo) throws RemoteException {
192 // Have we the correct application ?
194 System.err.println( "Problem of class transmission !" ) ;
198 if( t.getDependencies( 0 ) == null )
200 System.err.println( "No redifinition of getDependencies() functions !" ) ;
205 /** Creation of an empty new Register **/
206 Register reg = new Register() ;
208 /** Initialization of Grid architecture (G5K for now) **/
209 Grid grid = Utils.createGridG5k(gnodes);
212 /** Creation of tasks GTask **/
213 ArrayList<GTask> ts = new ArrayList<GTask>();
214 for (int i = 0; i < nbTasks; i++) {
215 ts.add(new GTask( i ) ) ;
218 /** Research of dependencies **/
219 for (int i = 0; i < nbTasks; i++) {
221 dep = t.getDependencies(i);
223 /** Adding dependencies to tasks **/
224 for (int j = 0; j < dep.length; j++) {
226 ts.get(i).addDependance(ts.get(dep[j]));
233 Graph graph = new Graph();
235 for( int i = 0 ; i < ts.size() ; i++)
237 graph.addGTask(ts.get(i));
244 // Thread.sleep(10000) ;
245 // } catch( Exception e ) {}
250 // Thread.sleep( 10000 ) ;
251 // } catch( Exception e ) {}
253 /** Selection of the mapping algorithm **/
258 al = new Simple(graph, grid);
261 al = new QM(graph, grid, paramAlgo);
264 al = new LSM(graph, grid, paramAlgo);
267 al = new DefaultMapping( graph, grid, gnodes ) ;
271 /** Launching the Mapping **/
274 /** Transforming mapping in register **/
275 Mapping mp = al.getMapping();
277 /** Creating the register **/
278 ArrayList<GNode> ag = mp.getMappedGNodes();
280 for (int i = 0; i < ag.size(); i++) {
281 reg.addNode((Node) ag.get(i).getNode());
282 gnodes.remove(ag.get(i));
283 Register.Instance().removeNode((Node) ag.get(i).getNode());
286 if (ag.size() != 0) {
287 SuperNodeListe.Instance().forwardCountNode();
292 // al = new DefaultMapping( graph, grid, gnodes ) ;
293 // /** Launching the Mapping **/
296 // /** Transforming mapping in register **/
297 // Mapping mp = al.getMapping();
299 // /** Creating the register **/
300 // ArrayList<GNode> ag = mp.getMappedGNodes();
302 // for (int i = 0; i < ag.size(); i++) {
303 // reg.addNode((Node) ag.get(i).getNode());
304 // gnodes.remove(ag.get(i));
305 // Register.Instance().removeNode((Node) ag.get(i).getNode());
308 // if (ag.size() != 0) {
309 // SuperNodeListe.Instance().forwardCountNode();
311 // return getRegisterSpawner(spawnerIP, nbTasks);
314 // daemonListChange = false ;
316 System.out.println( "Spawner returned reg: " + reg ) ;
318 /* Mapping distribution over other Super Nodes */
319 SuperNodeListe.Instance().setMapping( al ) ;
321 /* Returning result */
325 /*****************************************/
326 /**** Sébastien Miquée ****/
328 /** Recherche nouveau noeud **/
329 /*****************************************/
331 protected GNode delGNodeFromList( Node _n )
333 GNode deadGNode = null ;
335 for( int i = 0 ; i < gnodes.size() ; i++ )
337 if( ((Node)gnodes.get(i).getNode()).getId() == _n.getId() )
339 deadGNode = gnodes.remove( i ) ;
344 // daemonListChange = true ;
346 SuperNodeListe.Instance().removeGNode( deadGNode ) ;
352 public Node getNewNode( String _spawnerIP, Node _deadNode ) throws RemoteException
355 GNode remp = null, gnode = null ;
358 if( _deadNode != null )
360 gnode = delGNodeFromList( _deadNode ) ;
363 Mapping mp = al.getMapping() ;
365 // ArrayList <GNode> mapped = mp.getMappedGNodes() ;
367 mp.removeGNode( gnode ) ;
370 // mettre directement dans Algo !
371 // for( int i = 0 ; i < mapped.size() ; i++ )
373 // gnode = mapped.get( i ) ;
374 // tmp = (Node) gnode.getNode() ;
375 // if( tmp.getId() == _deadNode.getId() )
377 // mapped.remove( i ) ;
382 remp = al.replaceNode( gnode, gnodes ) ;
386 System.out.println( "Replacing node found." ) ;
387 node = (Node) remp.getNode() ;
388 delGNodeFromList( node ) ;
389 // gnodes.remove( remp ) ;
390 // Register.Instance().removeNode( node );
391 SuperNodeListe.Instance().forwardCountNode();
393 System.err.println( "Replacing node not found !!" ) ;
396 remp = al.getOtherGNode() ;
400 System.out.println( "Other new node found." ) ;
401 node = (Node) remp.getNode() ;
402 delGNodeFromList( node ) ;
403 // gnodes.remove( remp ) ;
404 // Register.Instance().removeNode( node );
405 SuperNodeListe.Instance().forwardCountNode();
407 System.err.println( "Other new node not found !!" ) ;
415 /**********************************************************/
416 /**********************************************************/
419 // public Node getNewNode(String spawnerIP) throws RemoteException {
420 // boolean found = false;
422 // Node tmpNode = null;
423 // SuperNodeData d = null;
424 // //int passage = 0;
426 // JaceSuperNodeInterface stub = null;
429 // System.out.println("\n" + spawnerIP
430 // + " (spawner) requests a new node : ");
431 // while (i < Register.Instance().getSize() && found == false) {
432 // tmpNode = Register.Instance().getNodeAt(i);
434 // if (tmpNode.getAppliName() == null
435 // && tmpNode.getAliveFlag() == true) {
436 // tmpNode.setAppliName("notnull");
439 // // enlever maintenant le noeud du register de
440 // // SuperNode??????
441 // // System.out.println("je remove le noeud car il va beater le spawner (getNewNode)");
442 // // Register.Instance().removeNodeAt(i);
443 // Register.Instance().removeNode(tmpNode);
444 // // Register.Instance().removeNode(tmpNode.getIP());
446 // int index = SuperNodeListe.Instance().existSuperNode(
447 // LocalHost.Instance().getIP());
449 // ((SuperNodeData) SuperNodeListe.Instance().getListe()
450 // .elementAt(index)).setNbOfNodes(Register.Instance()
452 // SuperNodeListe.Instance().forwardCountNode();
456 // } catch (Exception e1) {
457 // System.out.println("... plante en cherchant chez moi");
460 // // Register.Instance().viewAll();
461 // SuperNodeListe.Instance().viewAll();
464 // // si pas assez de noeud sur ce superNode,
465 // if (found == false) {
466 // System.out.println("pas de noeud dispo chez moi");
468 // SuperNodeListe snodeListTmp = SuperNodeListe.Instance().clone();
469 // // while ( (found == false) && (passage <
470 // // SuperNodeListe.Instance().getSize()) ) {
471 // while ((found == false) && (snodeListTmp.getSize() > 0)) {
472 // // System.out.println("passage = " + passage);
473 // // d = SuperNodeListe.Instance().getBestSuperNodeData();
474 // d = snodeListTmp.getBestSuperNodeData();
475 // System.out.println("KKKKKKKKKKKKKKK ......... le best c "
476 // + d.getIP() + " il en a " + d.getNbOfNodes());
478 // snode_IP = d.getIP();
479 // // si c moi, je passe au suivant
480 // if (LocalHost.Instance().getIP().equals(snode_IP)) {
483 // .println("OUUUUPS, c moi dc je tente un autre");
484 // snodeListTmp.removeSuperNode(d);
488 // stub = d.getStub();
490 // if (stub != null) {
492 // Register tmpReg = stub.reserveLocalNodes(1);
493 // if (tmpReg != null) {
494 // // for (int j = 0; j < tmpReg.getSize();
496 // System.out.println("IL EN A 1 !!!!!!!");
497 // tmpNode = tmpReg.getNodeAt(0);
499 // System.out.println("le snode " + snode_IP
500 // + " me reserve le noeud demande");
503 // .println("MERDE !!! pas de noeud dispo sur "
506 // .println("Je demande un noeud a un autre");
509 // } catch (Exception e) {
511 // .println("le snode est mort, je demande les noeuds a un autre");
512 // // remettre localement a 0 le nb de noeuds de ce
514 // SuperNodeListe.Instance().modifCountNode(
516 // snodeListTmp = SuperNodeListe.Instance()
522 // .println("PUTAIN !!!! aucun noeud encore dispo sur les snode");
523 // // passage = SuperNodeListe.Instance().getSize();
526 // snodeListTmp.removeSuperNode(d);
529 // } catch (Exception e2) {
530 // System.out.println("plante en cherchant chez les autres");
533 // // si pas assez de noeud sur tous les superNode,
534 // if (found == false) {
535 // System.out.println("aucun noeud dispo dans le systeme");
537 // System.out.println("je lui donne son noeud");
543 // public Register reserveLocalNodes(int nb) throws RemoteException {
544 // Register reg = null;
546 // .println("\nA superNode or a Spawner asks me for a register of "
547 // + nb + " Daemons");
553 // if (Register.Instance().getSize() == 0) {
554 // return new Register();
556 // reg = new Register();
558 // while (i < Register.Instance().getSize() && count < nb) {
559 // tmpNode = Register.Instance().getNodeAt(i);
561 // if (tmpNode.getAppliName() == null
562 // && tmpNode.getAliveFlag() == true
563 // /* && tmpNode.getNbOfBeats() > 10 */) {
564 // // if node available, alive and not recently connected, then
565 // tmpNode.setAppliName("notnull");
566 // reg.addNode(tmpNode);
568 // // remove now the node from SuperNode or later ?
569 // // System.out.println("I remove the Node from SuperNode beating it will now beat the Spawner");
570 // Register.Instance().removeNode(tmpNode);
573 // // increment counter only y Node NOT REMOVED
579 // // Register.Instance().viewAll();
580 // System.out.println("Number of Daemons reserved on me : " + count);
581 // // Inform other SuperNodes that some Daemons initialy registered on
583 // // are no longer available because reserved for the spawner that
585 // int index = SuperNodeListe.Instance().existSuperNode(
586 // LocalHost.Instance().getIP());
587 // ((SuperNodeData) SuperNodeListe.Instance().getListe().elementAt(
588 // index)).setNbOfNodes(Register.Instance().getSize());
591 // SuperNodeListe.Instance().forwardCountNode();
594 // System.out.println("I return " + count + " nodes");
595 // // System.out.println( reg ) ;
596 // // SuperNodeListe.Instance().viewAll() ;
602 public void addGNode( GNode _g ) throws RemoteException
610 public void removeGNode( GNode _g ) throws RemoteException
614 for( int i = 0 ; i < gnodes.size() ; i++ )
616 if( ((Node)gnodes.get(i).getNode()).getId() == ((Node)_g.getNode()).getId() )
628 public void setMapping( Algo _al ) throws RemoteException