Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Adding propagation of failed node replacement.
authorSébastien Miquée <sebastien.miquee@univ-fcomte.fr>
Wed, 17 Feb 2010 09:42:41 +0000 (10:42 +0100)
committerSébastien Miquée <sebastien.miquee@univ-fcomte.fr>
Wed, 17 Feb 2010 09:42:41 +0000 (10:42 +0100)
src/jaceP2P/JaceSuperNodeInterface.java
src/jaceP2P/JaceSuperNodeServer.java
src/jaceP2P/SuperNodeListe.java

index 23cb489..4ae6445 100644 (file)
@@ -53,6 +53,8 @@ public interface JaceSuperNodeInterface extends Remote {
        public boolean blockForMapping() throws RemoteException ;
        
        public void setMapping( Algo al ) throws RemoteException ;
        public boolean blockForMapping() throws RemoteException ;
        
        public void setMapping( Algo al ) throws RemoteException ;
+
+       public void updateMappedNode(GNode dead, GNode remp);
 }
 
 /** ! **/
 }
 
 /** ! **/
index 5648cd6..1963ff7 100644 (file)
@@ -434,6 +434,10 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
                                
                                delGNodeFromList( node ) ;
                                
                                
                                delGNodeFromList( node ) ;
                                
+                               /** Updating all mapping **/
+                               updateMappedNode( gnode, remp ) ;
+                               propagateReplaceNode( gnode, remp ) ;
+                               
                                authorized = false ;
                                
                                SuperNodeListe.Instance().forwardCountNode();
                                authorized = false ;
                                
                                SuperNodeListe.Instance().forwardCountNode();
@@ -466,11 +470,45 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
                return node ;
        }
        
                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
        /**********************************************************/
        /**********************************************************/
 
        @Override
+       /**
+        * Add a new node in the list.
+        * @param _g The new node
+        */
        public void addGNode( GNode _g ) throws RemoteException 
        {
                if( _g != null )
        public void addGNode( GNode _g ) throws RemoteException 
        {
                if( _g != null )
@@ -502,6 +540,7 @@ public class JaceSuperNodeServer extends UnicastRemoteObject implements
                                if( ((Node)gnodes.get(i).getNode()).getId() == ((Node)_g.getNode()).getId() ) 
                                {
                                        gnodes.remove( i ) ;
                                if( ((Node)gnodes.get(i).getNode()).getId() == ((Node)_g.getNode()).getId() ) 
                                {
                                        gnodes.remove( i ) ;
+                                       Register.Instance().removeNodeOfName( _g.getName() ) ;
                                        break ;
                                }
                        }
                                        break ;
                                }
                        }
index 61add0a..82facfc 100644 (file)
@@ -444,4 +444,28 @@ public class SuperNodeListe implements Cloneable {
                }
        }
 
                }
        }
 
+       public void propagateReplaceNode( GNode _dead, GNode _remp ) 
+       {
+               if( _dead != null && _remp != null )
+               {
+                       SuperNodeData d = null ;
+                       JaceSuperNodeInterface remoteStub = null ;
+
+                       for( int i = 0 ; i < liste.size() ; i++ ) 
+                       {
+                               d = (SuperNodeData) liste.elementAt( i ) ;
+                               if( ! d.getIP().equals(LocalHost.Instance().getIP() ) ) 
+                               {
+                                       // if not me, I inform the other super nodes
+                                       remoteStub = d.getStub() ;
+                                       try {
+                                               remoteStub.updateMappedNode( _dead, _remp ) ;
+                                       } catch( Exception e ) {
+                                               System.err.println( "Unable to set mapping data at SuperNode " + d.getIP() ) ;
+                                       }
+                               }
+                       }
+               }
+       }
+
 }
 }