private ArrayList<GNode> gnodes = null;
private Algo al = null ;
private int count = 0 ;
- private boolean inDemand = false, operating = false ;
+ private boolean inDemand = false, operating = false, authorized = false ;
// private boolean daemonListChange ;
// Constructors
/** Initialization of Grid architecture (G5K for now) **/
Grid grid = Utils.createGridG5k(gnodes);
grid.initClusters();
+
/** Creation of tasks GTask **/
ArrayList<GTask> ts = new ArrayList<GTask>();
}
}
}
+
Graph graph = new Graph();
/** Launching the Mapping **/
al.map();
+
/** Transforming mapping in register **/
Mapping mp = al.getMapping();
-
+
+
/** Creating the register **/
ArrayList<GNode> ag = mp.getMappedGNodes();
+ authorized = true ;
+
for (int i = 0; i < ag.size(); i++) {
reg.addNode((Node) ag.get(i).getNode());
- gnodes.remove(ag.get(i));
- Register.Instance().removeNode((Node) ag.get(i).getNode());
+ delGNodeFromList( (Node) ag.get(i).getNode() ) ;
+// gnodes.remove(ag.get(i));
+// Register.Instance().removeNode((Node) ag.get(i).getNode());
+ }
+
+
+ /** Searching extra nodes if any **/
+ if( nbNoeuds > nbTasks )
+ {
+ int nb = nbNoeuds - nbTasks ;
+ GNode sup = null ;
+
+ for( int i = 0 ; i < nb ; i ++ )
+ {
+ sup = al.getOtherGNode( gnodes ) ;
+ reg.addNodeBeg( (Node) sup.getNode() ) ;
+ delGNodeFromList( (Node) sup.getNode() ) ;
+ }
}
+
+ authorized = false ;
if (ag.size() != 0) {
SuperNodeListe.Instance().forwardCountNode();
GNode removedGNode = null ;
if( _n != null )
- {
- workingOnGnodes() ;
+ {
+ boolean free = false ;
+
+ if( ! operating )
+ {
+ workingOnGnodes() ;
+ free = true ;
+ }
for( int i = 0 ; i < gnodes.size() ; i++ )
{
if( ((Node)gnodes.get(i).getNode()).getId() == _n.getId() )
{
removedGNode = gnodes.remove( i ) ;
+ Register.Instance().removeNodeOfName( removedGNode.getName() ) ;
break ;
}
}
SuperNodeListe.Instance().removeGNode( removedGNode ) ;
- operating = false ;
+ if( free )
+ {
+ operating = false ;
+ }
}
while( ! operating )
{
inDemand = true ;
+ tmp = true ;
tmp = tmp && SuperNodeListe.Instance().workingOnGnodes() ;
{
System.out.println( "Replacing node found." ) ;
node = (Node) remp.getNode() ;
+
+ authorized = true ;
+
delGNodeFromList( node ) ;
+
+ /** Updating all mapping **/
+ updateMappedNode( gnode, remp ) ;
+ propagateReplaceNode( gnode, remp ) ;
+
+ authorized = false ;
+
SuperNodeListe.Instance().forwardCountNode();
} else {
System.err.println( "Replacing node not found !!" ) ;
{
System.out.println( "Other new node found." ) ;
node = (Node) remp.getNode() ;
+
+ authorized = true ;
+
delGNodeFromList( node ) ;
+
+ authorized = false ;
+
SuperNodeListe.Instance().forwardCountNode();
} else {
System.err.println( "Other new node not found !!" ) ;
return node ;
}
+ @Override
+ public void updateMappedNode( GNode _dead, GNode _remp )
+ {
+ int pos = 0 ;
+ pos = al.getMapping().getIdOfAssociation( _dead ) ;
+
+ if( pos == -1 )
+ {
+ System.err.println( "GNode "+_dead+" does not exist in the mapping!" ) ;
+ return ;
+ }
+
+ al.getMapping().getMapping().get( pos ).setGNode( _remp ) ;
+
+ System.out.println( "Succesfully replacing the fallen node in the mapping." ) ;
+ }
+
+ /**
+ * Inform all SuperNodes of the replacement of a fallen computing node.
+ * @param _dead The fallen node
+ * @param _remp The replacing node
+ */
+ private void propagateReplaceNode( GNode _dead, GNode _remp )
+ {
+ if( _dead != null && _remp != null )
+ {
+ SuperNodeListe.Instance().propagateReplaceNode( _dead, _remp ) ;
+ }
+ }
+
/**********************************************************/
/**********************************************************/
@Override
+ /**
+ * Add a new node in the list.
+ * @param _g The new node
+ */
public void addGNode( GNode _g ) throws RemoteException
{
if( _g != null )
{
if( _g != null )
{
- workingOnGnodes() ;
+ 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 ;
}
}
- operating = false ;
+ if( free )
+ operating = false ;
}
}
al = _al ;
}
+
@Override
/**
* Allow or deny the use of operations on the gnodes list, in order to
* @author miquee
* @return The authorization or not to block gnodes
*/
- public boolean blockForMapping()
+ public boolean blockForMapping() throws RemoteException
{
while( inDemand )
{
}
}
- if( operating )
+ if( operating && ! authorized )
{
return false ;
} else {