X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/jaceP2P.git/blobdiff_plain/80ef4550f12b23bb3c35aff33e40761fa9a1f71d..4fafa3d59cda94e7077ffc000a6d8ada04c922a5:/src/jaceP2P/JaceSuperNodeServer.java diff --git a/src/jaceP2P/JaceSuperNodeServer.java b/src/jaceP2P/JaceSuperNodeServer.java index 5648cd6..d2f5786 100644 --- a/src/jaceP2P/JaceSuperNodeServer.java +++ b/src/jaceP2P/JaceSuperNodeServer.java @@ -12,7 +12,6 @@ import and.Mapping.GTask; import and.Mapping.Graph; import and.Mapping.Grid; import and.Mapping.LSM; -import and.Mapping.Mapping; import and.Mapping.QM; import and.Mapping.Simple; import and.Mapping.Utils; @@ -58,7 +57,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements SuperNodeListe.Instance().viewAll(); } - public void sendSurplus(Vector nodes) throws RemoteException { + public void sendSurplus(Vector nodes, ArrayList _gnodes) throws RemoteException { System.out.println("Recieved " + nodes.size() + " nodes"); for (int i = 0; i < nodes.size(); i++) { @@ -77,10 +76,16 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements .setNbOfNodes(Register.Instance().getSize()); new ForwardCount().start(); } catch (Exception e) { - System.out.println("Error changing Server in SendSurplus : " + System.err.println("Error changing Server in SendSurplus : " + e); } } + + /** Updating gnodes **/ + if( _gnodes != null ) + { + gnodes = _gnodes ; + } } public void setToken() throws RemoteException { @@ -93,7 +98,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements System.out.println("Put token to true"); } catch (Exception e) { - System.out + System.err .println("Unable to heartBeat the next SuperNode with the new Token : " + e); } @@ -117,7 +122,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements public synchronized void workerRegistering(JaceInterface workerStub, String workerIP, String workerName, int port, GNode g) throws RemoteException { - System.out.println("CONNEXION of " + workerName); + System.out.println("CONNECTION of " + workerName); // Create the node Node noeud = new Node(workerStub); @@ -131,12 +136,13 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements noeud.setId( count ) ; noeud.setId( Long.parseLong( workerIP.replace( ".", "" ) ) ) ; - g.setNode(noeud); + g.setNode( noeud ) ; g.setId( noeud.getId() ) ; + g.setMapped( false ) ; workingOnGnodes() ; - gnodes.add(g); + gnodes.add( g ) ; // daemonListChange = true ; @@ -155,7 +161,9 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements .setNbOfNodes(Register.Instance().getSize()); SuperNodeListe.Instance().forwardCountNode(); + authorized = true ; SuperNodeListe.Instance().addGNode( g ) ; + authorized = false ; operating = false ; } @@ -192,6 +200,22 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements /** Mapping !! Sébastien Miquée **/ /*********************************/ + /** + * Search and return to the requester spawner a register containing + * computation nodes plus some extra nodes if needed. This method requires + * as parameters the mapping algorithm choice and its parameters, and the + * amount of requested nodes and the task to be used, in order to + * construct the tasks graph. + * @param spawnerIP IP of the requester + * @param nbTasks Amount of tasks + * @param t Tasks to be executed + * @param nbNoeuds Total amount of requested nodes + * @param algo Identifier of the mapping algorithm + * @param paramAlgo Parameter of the mapping algorithm + * + * @author Sébastien Miquée + */ + @Override public Register getRegisterSpawner(String spawnerIP, int nbTasks, Task t, int nbNoeuds, int algo, double paramAlgo) throws RemoteException { @@ -215,7 +239,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements /** Initialization of Grid architecture (G5K for now) **/ Grid grid = Utils.createGridG5k(gnodes); - grid.initClusters(); +// grid.initClusters(); /** Creation of tasks GTask **/ @@ -282,18 +306,14 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements al.map(); - /** Transforming mapping in register **/ - Mapping mp = al.getMapping(); - - /** Creating the register **/ - ArrayList ag = mp.getMappedGNodes(); + ArrayList ag = al.getMapping().getMappedGNodes(); authorized = true ; - for (int i = 0; i < ag.size(); i++) { + for( int i = 0; i < ag.size(); i++ ) { reg.addNode((Node) ag.get(i).getNode()); - delGNodeFromList( (Node) ag.get(i).getNode() ) ; + delGNodeFromList( (Node) ag.get(i).getNode(), 2 ) ; // gnodes.remove(ag.get(i)); // Register.Instance().removeNode((Node) ag.get(i).getNode()); } @@ -309,7 +329,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements { sup = al.getOtherGNode( gnodes ) ; reg.addNodeBeg( (Node) sup.getNode() ) ; - delGNodeFromList( (Node) sup.getNode() ) ; + delGNodeFromList( (Node) sup.getNode(), 2 ) ; } } @@ -321,26 +341,30 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements } -// daemonListChange = false ; - - System.out.println( "Spawner returned reg: " + reg ) ; +// System.out.println( "Spawner returned reg: " + reg ) ; - /** Mapping distribution over other Super Nodes */ + /** Mapping distribution over other SuperNodes */ SuperNodeListe.Instance().setMapping( al ) ; operating = false ; - /* Returning result */ + /** Returning result **/ return reg ; } - /*****************************************/ - /**** Sébastien Miquée ****/ - /** **/ - /** Recherche nouveau noeud **/ - /*****************************************/ - protected GNode delGNodeFromList( Node _n ) + /** + * Suppress a node from the gnodes list if this node is free, or remove + * it from the Mapping class of the mapping algorithm if this node is + * a computation node. After having done the local suppression of the node + * it propagates the suppression to other SuperNodes. + * @param _n The fallen node + * @param _mode Choice of the list (0: gnodes, 1: mapping, 2:just mapped) + * + * @author Sébastien Miquée + */ + @Override + public GNode delGNodeFromList( Node _n, int _mode ) throws RemoteException { GNode removedGNode = null ; @@ -354,19 +378,43 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements free = true ; } - for( int i = 0 ; i < gnodes.size() ; i++ ) + /** The dead node is not in the mapping **/ + if( _mode == 0 || _mode == 2) { - if( ((Node)gnodes.get(i).getNode()).getId() == _n.getId() ) + for( int i = 0 ; i < gnodes.size() ; i++ ) { - removedGNode = gnodes.remove( i ) ; - Register.Instance().removeNodeOfName( removedGNode.getName() ) ; - break ; + if( ((Node)gnodes.get(i).getNode()).getId() == _n.getId() ) + { + removedGNode = gnodes.remove( i ) ; + Register.Instance().removeNodeOfName( removedGNode.getName() ) ; + break ; + } } } - -// daemonListChange = true ; - - SuperNodeListe.Instance().removeGNode( removedGNode ) ; + + /** The dead node is in the mapping **/ + if( _mode == 1 ) + { + ArrayList temp = al.getMapping().getMappedGNodes() ; + + for( int i = 0 ; i < temp.size() ; i++ ) + { + if( ((Node)temp.get(i).getNode()).getId() == _n.getId() ) + { + removedGNode = temp.get( i ) ; + Register.Instance().removeNodeOfName( removedGNode.getName() ) ; + break ; + } + } + } + + /** Removing the dead node from the Grid **/ + if( _mode == 0 || _mode == 1 ) { + al.getGrid().removeGNode( removedGNode ) ; + } + + /** Propagation of the deletion **/ + SuperNodeListe.Instance().removeGNode( removedGNode, _mode ) ; if( free ) { @@ -379,6 +427,13 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements } + /** + * Determine if this SuperNode can operate on the gnodes list. + * It asks other SuperNodes to know if their are working on this list + * and set the authorization, or not. + * + * @author Sébastien Miquée + */ private void workingOnGnodes() { boolean tmp = true ; @@ -410,7 +465,16 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements inDemand = false ; } - + /** + * Search and return a new node when one failed or when JaceP2P needs another + * one. For the first case, the given failed node should not be null, and + * null in the other case. + * @param _spawnerIP IP of the requester + * @param _deadNode The failed node + * + * @author Sébastien Miquée + */ + @Override public Node getNewNode( String _spawnerIP, Node _deadNode ) throws RemoteException { Node node = null ; @@ -421,18 +485,19 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements if( _deadNode != null ) { - gnode = delGNodeFromList( _deadNode ) ; - + authorized = true ; + + gnode = delGNodeFromList( _deadNode, 1 ) ; + remp = al.replaceNode( gnode, gnodes ) ; if( remp != null ) { System.out.println( "Replacing node found." ) ; - node = (Node) remp.getNode() ; - authorized = true ; + remp.setMapped( true ) ; - delGNodeFromList( node ) ; + delGNodeFromList( (Node) remp.getNode(), 2 ) ; authorized = false ; @@ -446,11 +511,12 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements if( remp != null ) { System.out.println( "Other new node found." ) ; - node = (Node) remp.getNode() ; + + remp.setMapped( true ) ; authorized = true ; - delGNodeFromList( node ) ; + delGNodeFromList( (Node) remp.getNode(), 2 ) ; authorized = false ; @@ -460,6 +526,12 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements } } + + /** Updating all mapping **/ + updateMappedNode( gnode, remp ) ; + propagateReplaceNode( gnode, remp ) ; + + /** Free the gnodes use **/ operating = false ; @@ -467,25 +539,68 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements } - /**********************************************************/ - /**********************************************************/ - + /** + * Replace a failed GNode in the mapping by another one. + * This method is called by the SuperNodeList, to broadcast the modification. + * @param _dead The failed node + * @param _remp The replacing node + * + * @author Sébastien Miquée + */ @Override - public void addGNode( GNode _g ) throws RemoteException + public void updateMappedNode( GNode _dead, GNode _remp ) { - if( _g != null ) + if( _remp != null ) { - workingOnGnodes() ; - - gnodes.add( _g ) ; + int pos = 0 ; + + pos = al.getMapping().getIdOfAssociation( _dead ) ; + + if( pos != -1 ) + { + /** Changing the node in the mapping **/ + al.getMapping().getMapping().get( pos ).setGNode( _remp ) ; + + System.out.println( "Succesfully replacing the fallen node in the mapping." ) ; + } - operating = false ; + /** Changing the status in the grid **/ + al.getGrid().setMappedStatus( _remp, true ) ; + + al.updateGrid() ; + } else { + System.err.println( "The new GNode is null!" ) ; } } + + /** + * Inform all SuperNodes of the replacement of a failed computing node. + * @param _dead The failed node + * @param _remp The replacing node + * + * @author Sébastien Miquée + */ + private void propagateReplaceNode( GNode _dead, GNode _remp ) throws RemoteException + { + if( _remp != null ) + { + SuperNodeListe.Instance().propagateReplaceNode( _dead, _remp ) ; + } + } + + /**********************************************************/ + /**********************************************************/ + @Override - public void removeGNode( GNode _g ) throws RemoteException + /** + * Add a new node in the list. + * @param _g The new node + * + * @author Sébastien Miquée + */ + public void addGNode( GNode _g ) throws RemoteException { if( _g != null ) { @@ -495,24 +610,52 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements { workingOnGnodes() ; free = true ; - } + } - for( int i = 0 ; i < gnodes.size() ; i++ ) - { - if( ((Node)gnodes.get(i).getNode()).getId() == ((Node)_g.getNode()).getId() ) - { - gnodes.remove( i ) ; - break ; - } - } + gnodes.add( _g ) ; if( free ) operating = false ; } - } +// @Override +// public void removeGNode( GNode _g ) throws RemoteException +// { +// if( _g != null ) +// { +// boolean free = false ; +// +// if( ! operating ) +// { +// workingOnGnodes() ; +// free = true ; +// } +// +// for( int i = 0 ; i < gnodes.size() ; i++ ) +// { +// if( ((Node)gnodes.get(i).getNode()).getId() == ((Node)_g.getNode()).getId() ) +// { +// gnodes.remove( i ) ; +// Register.Instance().removeNodeOfName( _g.getName() ) ; +// break ; +// } +// } +// +// if( free ) +// operating = false ; +// } +// +// } + + + /** + * Set the local mapping with another done on an other SuperNode. + * @param _al The new mapping + * + * @author Sébastien Miquée + */ @Override public void setMapping( Algo _al ) throws RemoteException { @@ -524,8 +667,9 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements /** * Allow or deny the use of operations on the gnodes list, in order to * do a mapping operation. - * @author miquee * @return The authorization or not to block gnodes + * + * @author Sébastien Miquée */ public boolean blockForMapping() throws RemoteException { @@ -545,6 +689,18 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements return true ; } } + + /** + * Return the array containing the current not mapped nodes available. + * @return The array of available nodes + * + * @author Sébastien Miquée + */ + @Override + public ArrayList getGNodes() throws RemoteException + { + return gnodes ; + } }