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;
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 ;
/** 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 {
/** Initialization of Grid architecture (G5K for now) **/
Grid grid = Utils.createGridG5k(gnodes);
- grid.initClusters();
+// grid.initClusters();
/** Creation of tasks GTask **/
al.map();
- /** Transforming mapping in register **/
- Mapping mp = al.getMapping();
-
-
/** Creating the register **/
- ArrayList<GNode> ag = mp.getMappedGNodes();
+ ArrayList<GNode> ag = al.getMapping().getMappedGNodes();
authorized = true ;
for( int i = 0; i < ag.size(); i++ ) {
reg.addNode((Node) ag.get(i).getNode());
- delGNodeFromList( (Node) ag.get(i).getNode(), 0 ) ;
+ delGNodeFromList( (Node) ag.get(i).getNode(), 2 ) ;
// gnodes.remove(ag.get(i));
// Register.Instance().removeNode((Node) ag.get(i).getNode());
}
{
sup = al.getOtherGNode( gnodes ) ;
reg.addNodeBeg( (Node) sup.getNode() ) ;
- delGNodeFromList( (Node) sup.getNode(), 0 ) ;
+ delGNodeFromList( (Node) sup.getNode(), 2 ) ;
}
}
// System.out.println( "Spawner returned reg: " + reg ) ;
- /** Mapping distribution over other Super Nodes */
+ /** Mapping distribution over other SuperNodes */
SuperNodeListe.Instance().setMapping( al ) ;
operating = false ;
}
+ /**
+ * 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
{
}
/** The dead node is not in the mapping **/
- if( _mode == 0 )
+ if( _mode == 0 || _mode == 2)
{
for( int i = 0 ; i < gnodes.size() ; i++ )
{
}
/** Removing the dead node from the Grid **/
- al.getGrid().removeGNode( removedGNode ) ;
+ if( _mode == 0 || _mode == 1 ) {
+ al.getGrid().removeGNode( removedGNode ) ;
+ }
+ /** Propagation of the deletion **/
SuperNodeListe.Instance().removeGNode( removedGNode, _mode ) ;
if( free )
}
+ /**
+ * 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 ;
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
{
if( remp != null )
{
System.out.println( "Replacing node found." ) ;
- node = (Node) remp.getNode() ;
- delGNodeFromList( node, 0 ) ;
+ remp.setMapped( true ) ;
- /** Updating all mapping **/
- updateMappedNode( gnode, remp ) ;
- propagateReplaceNode( gnode, remp ) ;
+ delGNodeFromList( (Node) remp.getNode(), 2 ) ;
authorized = false ;
if( remp != null )
{
System.out.println( "Other new node found." ) ;
- node = (Node) remp.getNode() ;
+
+ remp.setMapped( true ) ;
authorized = true ;
- delGNodeFromList( node, 0 ) ;
+ delGNodeFromList( (Node) remp.getNode(), 2 ) ;
authorized = false ;
}
}
+
+ /** Updating all mapping **/
+ updateMappedNode( gnode, remp ) ;
+ propagateReplaceNode( gnode, remp ) ;
+
+
/** Free the gnodes use **/
operating = false ;
return node ;
}
+
+ /**
+ * 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 updateMappedNode( GNode _dead, GNode _remp )
{
- int pos = 0 ;
- pos = al.getMapping().getIdOfAssociation( _dead ) ;
-
- if( pos == -1 )
+ if( _remp != null )
{
- System.err.println( "GNode "+_dead+" does not exist in the mapping!" ) ;
- return ;
- }
+ int pos = 0 ;
- al.getMapping().getMapping().get( pos ).setGNode( _remp ) ;
-
- System.out.println( "Succesfully replacing the fallen node in the mapping." ) ;
+ 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." ) ;
+ }
+
+ /** 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 fallen computing node.
- * @param _dead The fallen node
+ * 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( _dead != null && _remp != null )
+ if( _remp != null )
{
SuperNodeListe.Instance().propagateReplaceNode( _dead, _remp ) ;
}
/**********************************************************/
/**********************************************************/
+
@Override
/**
* Add a new node in the list.
* @param _g The new node
+ *
+ * @author Sébastien Miquée
*/
public void addGNode( GNode _g ) throws RemoteException
{
// }
+ /**
+ * 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
{
/**
* 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
{
}
}
+ /**
+ * Return the array containing the current not mapped nodes available.
+ * @return The array of available nodes
+ *
+ * @author Sébastien Miquée
+ */
@Override
public ArrayList<GNode> getGNodes() throws RemoteException
{