Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Changing save mechanism.
[hpcvm.git] / src / and / hpcvm / Server.java
index dafd9c5..b776409 100644 (file)
@@ -82,14 +82,14 @@ public class Server extends UnicastRemoteObject implements ServicesServer
        {
                private ConnectedClient client ;
                private boolean save_status ;
-               private String save_neighbor ;
+               private ArrayList<ServicesClient> save_neighbor ;
                private String lastSaveName ;
                
                ComputingClient( ConnectedClient cl )
                {
                        client = cl ;
                        save_status = false ;
-                       save_neighbor = "none" ;
+                       save_neighbor = new ArrayList<ServicesClient>() ;
                        lastSaveName = "none" ;
                }
                
@@ -99,11 +99,13 @@ public class Server extends UnicastRemoteObject implements ServicesServer
                
                protected void setSaveStatus( boolean _status ) { save_status = _status ; }
                
-               protected void setSaveNeighbor( String _sn ) 
+               protected void setSaveNeighbor( ServicesClient _sn ) 
                { 
-                       if( _sn != null && ! _sn.isEmpty() )
+                       if( _sn != null )
                        {
-                               save_neighbor = _sn ; 
+                               save_neighbor.set( 0, _sn ) ; 
+                               
+                               System.out.println( "My save neighbor is " + _sn ) ;
                        
                                try {
                                        client.getStub().setSavingNeighbor( _sn ) ;
@@ -115,7 +117,15 @@ public class Server extends UnicastRemoteObject implements ServicesServer
                        }
                }
                
-               protected String getSaveNeighbor() { return save_neighbor ; }
+               protected ServicesClient getSaveNeighbor() 
+               {
+                       if( save_neighbor.isEmpty() )
+                       {
+                               return null ;
+                       } else {
+                               return save_neighbor.get( 0 ) ;
+                       }
+               }
 
                public void setLastSave( String _saveName ) 
                {
@@ -400,16 +410,13 @@ public class Server extends UnicastRemoteObject implements ServicesServer
                @Override
                public void run() 
                {
-                       synchronized( counter ){
-                       counter.inc() ;}
-                       System.out.println("ici");
                        if( cl != null && cl.getStatus().equalsIgnoreCase( "running" ) ||
                                        cl.getStatus().equalsIgnoreCase( "saving" ) )
                        {
-                               System.out.println("ok");
                                ComputingClient cc = cl.getComputingClient() ;
+                               ServicesClient dead = cc.getClient().getStub() ;
                                String ipDead = cc.getClient().getIP() ;
-                               
+                                                               
                                boolean ok = false ;
                                
                                for( int i = 0 ; i < clients.size() ; i++ )
@@ -434,19 +441,20 @@ public class Server extends UnicastRemoteObject implements ServicesServer
                                                } else {
                                                        System.out.println( "Trying to replace " + cc.getClient().getName() + " with " +
                                                                        clients.get(i).getName() + " ... " ) ;
-                                                               
+                                                       
+                                                       String save_name = computingClients.get( pos ).getLastSave() ;
+                                                       
                                                        ComputingClient ccl = new ComputingClient( clients.get(i) ) ;
                                                        clients.get( i ).setComputingClient( ccl ) ;
-                                                       String sn = computingClients.get( pos ).getSaveNeighbor() ;
+                                                       ServicesClient sn = computingClients.get( pos ).getSaveNeighbor() ;
                                                        ccl.setSaveNeighbor( sn ) ;
                                                        computingClients.set( pos, ccl ) ;
-//                                                             computingClients.get( pos ).setSaveNeighbor( sn ) ;
-                                                               
+
                                                                
                                                        int res = 1 ;
                                                        try {
                                                                res = computingClients.get( pos ).getClient().getStub().
-                                                               retrieveSave( computingClients.get(i).getLastSave() ) ;
+                                                                     retrieveSave( save_name ) ;
                                                        } catch( RemoteException e ) {
                                                                System.err.println( "Unable to indicate to client to retrieve last save!" ) ;
                                                                e.printStackTrace() ;
@@ -486,6 +494,19 @@ public class Server extends UnicastRemoteObject implements ServicesServer
                                                        
                                                if( ok )
                                                {
+                                                       for( int k = 0 ; k < computingClients.size() ; k++ )
+                                                       {
+                                                               try {
+                                                                       computingClients.get( i ).getClient().getStub().
+                                                                               replaceSavingNeighbor( dead, clients.get( i ).getStub() ) ;
+                                                               } catch( RemoteException e ) {
+                                                                       System.err.println( "Unable to inform " + computingClients.get( k ).getClient().getName() +
+                                                                                       " of the replacement of a save neighbor!" ) ;
+                                                                       e.printStackTrace() ;
+                                                               }
+                                                       }
+                                                       
+                                                       
                                                        System.out.println( "Dead client successfully replaced." ) ;
                                                        // restart vms
                                                        break ;
@@ -550,6 +571,9 @@ public class Server extends UnicastRemoteObject implements ServicesServer
 //                                                                     break ;
 //                                                             }
 //                                                     }
+                                                       synchronized( counter ){
+                                                               counter.inc() ;}
+                                                               
                                                        
                                                        new Server.FaultManager( cl ).start() ;
                                                        nb_disconnections_computing++ ;
@@ -579,7 +603,23 @@ public class Server extends UnicastRemoteObject implements ServicesServer
                                
                                if( nb_disconnections_computing > 0 )
                                {
-                                       System.out.println( "I will redeploy save and restart VMs ..." ) ;
+                                       System.out.println( "Sending emergency stop signal to all computing nodes ... " ) ;
+                                       
+                                       for( int i = 0 ; i < clients.size() ; i++ )
+                                       {
+                                               if( clients.get( i ).getStatus().equalsIgnoreCase( "running" ) 
+                                                       || clients.get( i ).getStatus().equalsIgnoreCase( "saving" ) )
+                                               {
+                                                       try {
+                                                               clients.get( i ).getStub().emergencyStop() ;
+                                                       } catch( RemoteException e ) {
+                                                               System.err.println( "Unable to invoke emergency stop signal on " + clients.get( i ).getName() ) ;
+                                                               e.printStackTrace() ;
+                                                       }
+                                               }
+                                       }
+                                       
+                                       System.out.println( "I will redeploy save and restart VMs ... " ) ;
                                        
                                        synchronized( counter ) 
                                        {
@@ -591,6 +631,7 @@ public class Server extends UnicastRemoteObject implements ServicesServer
                                                while( counter.getNb() != 0 )
                                                {
                                                        try {
+                                                               System.out.println( "### WAITING counter ###" ) ;
                                                                counter.wait() ;  // !!!!! synchro
                                                        } catch( InterruptedException e ) {
                                                                e.printStackTrace() ;
@@ -724,7 +765,7 @@ public class Server extends UnicastRemoteObject implements ServicesServer
                                                {
                                                        System.err.println( "Problem in ComputingClients list!" ) ;
                                                } else {
-                                                       computingClients.get( index ).setSaveNeighbor( computingClients.get( index2 ).getClient().getIP() ) ;
+                                                       computingClients.get( index ).setSaveNeighbor( computingClients.get( index2 ).getClient().getStub() ) ;
                                                }
                                        } else {
                                                index = computingClients.indexOf( tmp.get( i ) ) ;
@@ -734,7 +775,7 @@ public class Server extends UnicastRemoteObject implements ServicesServer
                                                {
                                                        System.err.println( "Problem in ComputingClients list!" ) ;
                                                } else {
-                                                       computingClients.get( index ).setSaveNeighbor( computingClients.get( index2 ).getClient().getIP() ) ;
+                                                       computingClients.get( index ).setSaveNeighbor( computingClients.get( index2 ).getClient().getStub() ) ;
                                                }
                                        }
                                }