Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Modifying functions manipulating Grid classes.
[jaceP2P.git] / src / jaceP2P / JaceSuperNodeServer.java
index 5648cd6..5e67a4c 100644 (file)
@@ -58,7 +58,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
                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++) {
@@ -77,10 +77,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 +99,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 +123,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);
@@ -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,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
        /** Mapping !! Sébastien Miquée **/
        /*********************************/
 
+       @Override
        public Register getRegisterSpawner(String spawnerIP, int nbTasks, Task t,
                        int nbNoeuds, int algo, double paramAlgo) throws RemoteException {
 
@@ -291,9 +300,9 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
 
                        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(), 0 ) ;
 //                             gnodes.remove(ag.get(i));
 //                             Register.Instance().removeNode((Node) ag.get(i).getNode());
                        }
@@ -309,7 +318,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
                                {
                                        sup = al.getOtherGNode( gnodes ) ;
                                        reg.addNodeBeg( (Node) sup.getNode() ) ;
-                                       delGNodeFromList( (Node) sup.getNode() ) ;
+                                       delGNodeFromList( (Node) sup.getNode(), 0 ) ;
                                }
                        }
                        
@@ -321,26 +330,20 @@ 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 */
                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 ;
                
@@ -354,19 +357,40 @@ 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 )
                        {
-                               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<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 )
                        {
@@ -410,7 +434,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
                inDemand = false ;
        }
 
-               
+       @Override
        public Node getNewNode( String _spawnerIP, Node _deadNode ) throws RemoteException
        {
                Node node = null ;
@@ -421,8 +445,10 @@ 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 )
@@ -430,9 +456,11 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
                                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 ;
                                
@@ -450,7 +478,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
                                
                                authorized = true ;
                                
-                               delGNodeFromList( node ) ;
+                               delGNodeFromList( node, 0 ) ;
                                
                                authorized = false ;
                                
@@ -466,26 +494,46 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
                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 )
                {
@@ -495,24 +543,46 @@ 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 ;
+//             }
+//             
+//     }
+       
+
        @Override
        public void setMapping( Algo _al ) throws RemoteException 
        {
@@ -545,6 +615,12 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
                        return true ;
                }
        }
+
+       @Override
+       public ArrayList<GNode> getGNodes() throws RemoteException 
+       {
+               return gnodes ;
+       }
        
 }