SuperNodeListe.Instance().viewAll();
}
- public void sendSurplus(Vector<?> nodes) throws RemoteException {
+ public void sendSurplus(Vector<?> nodes, ArrayList<GNode> _gnodes) throws RemoteException {
System.out.println("Recieved " + nodes.size() + " nodes");
for (int i = 0; i < nodes.size(); i++) {
.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 {
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);
}
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);
.setNbOfNodes(Register.Instance().getSize());
SuperNodeListe.Instance().forwardCountNode();
+ authorized = true ;
SuperNodeListe.Instance().addGNode( g ) ;
+ authorized = false ;
operating = false ;
}
/** Mapping !! Sébastien Miquée **/
/*********************************/
+ @Override
public Register getRegisterSpawner(String spawnerIP, int nbTasks, Task t,
int nbNoeuds, int algo, double paramAlgo) throws RemoteException {
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());
- gnodes.remove(ag.get(i));
- Register.Instance().removeNode((Node) ag.get(i).getNode());
+ delGNodeFromList( (Node) ag.get(i).getNode(), 0 ) ;
+// 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(), 0 ) ;
+ }
}
authorized = false ;
}
-// daemonListChange = false ;
-
- System.out.println( "Spawner returned reg: " + reg ) ;
+// System.out.println( "Spawner returned reg: " + reg ) ;
/** Mapping distribution over other Super Nodes */
SuperNodeListe.Instance().setMapping( al ) ;
operating = false ;
- /* Returning result */
+ /** Returning result **/
return reg ;
}
- /*****************************************/
- /**** Sébastien Miquée ****/
- /** **/
- /** Recherche nouveau noeud **/
- /*****************************************/
- protected GNode delGNodeFromList( Node _n )
+ @Override
+ public GNode delGNodeFromList( Node _n, int _mode ) throws RemoteException
{
GNode removedGNode = null ;
free = true ;
}
- for( int i = 0 ; i < gnodes.size() ; i++ )
+ /** The dead node is not in the mapping **/
+ if( _mode == 0 )
{
- if( ((Node)gnodes.get(i).getNode()).getId() == _n.getId() )
+ for( int i = 0 ; i < gnodes.size() ; i++ )
{
- removedGNode = gnodes.remove( i ) ;
- 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<GNode> 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 **/
+ al.getGrid().removeGNode( removedGNode ) ;
+
+ SuperNodeListe.Instance().removeGNode( removedGNode, _mode ) ;
if( free )
{
inDemand = false ;
}
-
+ @Override
public Node getNewNode( String _spawnerIP, Node _deadNode ) throws RemoteException
{
Node node = null ;
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 ;
+ delGNodeFromList( node, 0 ) ;
- delGNodeFromList( node ) ;
+ /** Updating all mapping **/
+ updateMappedNode( gnode, remp ) ;
+ propagateReplaceNode( gnode, remp ) ;
authorized = false ;
authorized = true ;
- delGNodeFromList( node ) ;
+ delGNodeFromList( node, 0 ) ;
authorized = false ;
return node ;
}
-
- /**********************************************************/
- /**********************************************************/
-
@Override
- public void addGNode( GNode _g ) throws RemoteException
+ public void updateMappedNode( GNode _dead, GNode _remp )
{
- if( _g != null )
+ int pos = 0 ;
+ pos = al.getMapping().getIdOfAssociation( _dead ) ;
+
+ if( pos == -1 )
{
- workingOnGnodes() ;
-
- gnodes.add( _g ) ;
-
- operating = false ;
+ 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 ) throws RemoteException
+ {
+ if( _dead != null && _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
+ */
+ public void addGNode( GNode _g ) throws RemoteException
{
if( _g != null )
{
- workingOnGnodes() ;
+ boolean free = false ;
- for( int i = 0 ; i < gnodes.size() ; i++ )
+ if( ! operating )
{
- if( ((Node)gnodes.get(i).getNode()).getId() == ((Node)_g.getNode()).getId() )
- {
- gnodes.remove( i ) ;
- break ;
- }
- }
+ workingOnGnodes() ;
+ free = true ;
+ }
+
+ gnodes.add( _g ) ;
- operating = false ;
+ 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 ;
+// }
+//
+// }
+
+
@Override
public void setMapping( Algo _al ) throws RemoteException
{
return true ;
}
}
+
+ @Override
+ public ArrayList<GNode> getGNodes() throws RemoteException
+ {
+ return gnodes ;
+ }
}