Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Correcting some bugs about nodes fault tolerance.
[jaceP2P.git] / src / jaceP2P / JaceSuperNodeServer.java
index c85a7c5..1b06066 100644 (file)
@@ -293,8 +293,24 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
                        
                        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 ;
@@ -324,7 +340,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
        /**      Recherche nouveau noeud        **/
        /*****************************************/
        
-       protected GNode delGNodeFromList( Node _n )
+       protected GNode delGNodeFromList( Node _n, int _mode )
        {
                GNode removedGNode = null ;
                
@@ -338,14 +354,36 @@ 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 ) ;
-                                       break ;
+                                       if( ((Node)gnodes.get(i).getNode()).getId() == _n.getId() ) 
+                                       {
+                                               removedGNode = gnodes.remove( i ) ;
+                                               Register.Instance().removeNodeOfName( removedGNode.getName() ) ;
+                                               break ;
+                                       }
                                }
                        }
+                       
+                       /** 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 ;
+                                       }
+                               }       
+                       }
+                       
                
 //             daemonListChange = true ;
                
@@ -404,8 +442,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 )
@@ -413,9 +453,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 ;
                                
@@ -433,7 +475,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
                                
                                authorized = true ;
                                
-                               delGNodeFromList( node ) ;
+                               delGNodeFromList( node, 0 ) ;
                                
                                authorized = false ;
                                
@@ -449,20 +491,61 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
                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 ) throws RemoteException
+       {
+               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 )
                {
-                       workingOnGnodes() ;
+                       boolean free = false ;
+                       
+                       if( ! operating )
+                       {
+                               workingOnGnodes() ;
+                               free = true ;
+                       }       
                        
                        gnodes.add( _g ) ;
                        
-                       operating = false ;
+                       if( free )
+                               operating = false ;
                }
        }
        
@@ -472,18 +555,26 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
        {
                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 ;
                }
                
        }