Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Correction of the start application time setup.
[hpcvm.git] / src / and / hpcvm / Client.java
index 66a43c3..e3233eb 100644 (file)
@@ -39,14 +39,15 @@ public class Client extends UnicastRemoteObject implements ServicesClient
        private int wait_start ;
        private int max_start_try ;
        private boolean isRestartedSave ;
-       private long save_interleave ;
-       private long date_last_save ;
+//     private long save_interleave ;
+//     private long date_last_save ;
        private SaveProcess saveProcess;
        private int maxRetryVM ;
        private int timeRetryVM ;
        private Semaphore sema ;
        private boolean emergencyStop ;
        private Process procSave ;
+       private SaveRequest saveRequest ;
        private boolean lastSaveOk ;
        
                
@@ -71,9 +72,19 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                        procSave.destroy() ;
                } catch( Exception e ) {}
                
+               // Stopping the save request
+               synchronized( saveRequest )
+               {
+                       saveRequest.setStatus( false ) ;
+                       try {
+                               saveRequest.notifyAll() ;
+                       } catch( Exception e ) {}
+               }
+               
                stopVM() ;
        }
        
+       
        @Override
        public int startVM( int _mode ) 
        {               
@@ -85,6 +96,13 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                System.err.println( "Problem with semaphore acquiring!" ) ;
                                e2.printStackTrace() ;
                        }
+
+                       
+                       // Checking first start
+                       if( machine.checkVmx() == 1 )
+                       {
+                               return 1 ;
+                       }
                        
                        boolean ret = true ;
                        int retry = 0 ;
@@ -185,7 +203,7 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                " -gp " + machine.getVmUserPasswd() + " runScriptInGuest " +
                                working_directory + "/" + machine.getDirectory() 
                                + "/" + machine.getVmx_name() + " " + ushell + 
-                               " \"echo ok\"" ;// + " -noWait " ;
+                               " \"echo ok\"" ;
                                
                                try {
                                        FileWriter fw = new FileWriter( new File( working_directory + "/testStarted.sh" ) ) ;
@@ -215,16 +233,9 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                                if( p.exitValue() == 0 )
                                                {
                                                        started = true ;
-//                                             machine.setStatus( "running" ) ;
-//                                             if( _mode == 0 )
-//                                             {
-//                                                     LocalHost.Instance().getServerStub().changeStatus( 
-//                                                             LocalHost.Instance().getIP(), "running" ) ;
-//                                             } 
                                                        ret = false ;
                                                } else {
                                                        System.err.println( "Error while checking if the VM is started!" ) ;
-//                                             printProcessError( p.getErrorStream() ) ;
                                                        ret = printProcessError( p ) ;
                                                
                                                        if( ! ret )
@@ -245,7 +256,6 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                                                System.out.println( "Retrying (" + retry + ") ... " ) ;
                                                                Thread.sleep( timeRetryVM ) ;
                                                        }
-//                                             wait_start = wait_start / 2 ;
                                                        count++ ;
                                                }
                                        } catch( IOException e ) {
@@ -331,7 +341,6 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                                ret = false ;
                                        } else {
                                                System.err.println( "VM did not received the host IP!" ) ;
-//                                     printProcessError( p.getErrorStream() ) ;
                                                ret = printProcessError( p ) ;
                                        
                                                if( ! ret )
@@ -410,12 +419,10 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                        if( p.exitValue() == 0 )
                                        {
                                                System.out.println( "VM received its assigned IP." ) ;
-//                                     return 0 ;
                                                ret = false ;
                                                machine.setStatus( "running" ) ;
                                        } else {
                                                System.err.println( "VM did not received its assigned IP!" ) ;
-//                                     printProcessError( p.getErrorStream() ) ;
                                                ret = printProcessError( p ) ;
                                        
                                                if( ! ret )
@@ -473,6 +480,7 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                return 1 ;
        }
 
+       
        @Override
        public int stopVM() 
        {               
@@ -520,7 +528,6 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                        ret = false ;
                                } else {
                                        System.err.println( "Virtual machine not stopped!" ) ;
-//                                     printProcessError( p.getErrorStream() ) ;
                                        ret = printProcessError( p ) ;
                                        
                                        if( ! ret )
@@ -561,41 +568,9 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                e1.printStackTrace() ;
                        }
                        
-                       if( ! isRestartedSave )
+
+                       if(     machine.checkVmx() == 0 )
                        {
-                               /** Restoring the original vmx file (necessary after a crash) **/
-                               command = new String[]{ "/bin/cp", 
-                                               working_directory + "/" + machine.getDirectory() + "/" + machine.getVmx_name_normal(),
-                                               working_directory + "/" + machine.getDirectory() + "/" + machine.getVmx_name() } ;
-                               
-                                       try {
-                                               Process p = Runtime.getRuntime().exec( command ) ;
-                                               p.waitFor() ;
-                       
-                                               if( p.exitValue() == 0 )
-                                               {
-                                                       System.out.println( "Successfully replaced the VMX file." ) ;
-                                                       sema.release() ;
-                                                       emergencyStop = false ;
-                                                       return 0 ;
-                                               } else {
-                                                       System.err.println( "Unsuccessful replacement of the VMX file!" ) ;
-//                                                     printProcessError( p.getErrorStream() ) ;
-                                                       printProcessError( p ) ;
-                                                       sema.release() ;
-                                                       return 1 ;
-                                               }
-                                       } catch( IOException e ) {
-                                               System.err.println( "Error during VMX file replacement: " ) ;
-                                               e.printStackTrace() ;
-                                               sema.release() ;
-                                               return 1 ;
-                                       } catch( InterruptedException e ) {
-                                               e.printStackTrace() ;
-                                               sema.release() ;
-                                               return 1 ;
-                                       }
-                       } else {
                                sema.release() ;
                                emergencyStop = false ;
                                return 0 ;
@@ -655,7 +630,6 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                        ret = false ;
                                } else {
                                        System.err.println( "Virtual machine not suspended!" ) ;
-//                                     printProcessError( p.getErrorStream() ) ;
                                        ret = printProcessError( p ) ;
                                        
                                        if( ! ret )
@@ -745,7 +719,6 @@ public class Client extends UnicastRemoteObject implements ServicesClient
 
                                } else {
                                        System.err.println( "Virtual machine not restarted!" ) ;
-//                                     printProcessError( p.getErrorStream() ) ;
                                        ret = printProcessError( p ) ;
                                        
                                        if( ! ret )
@@ -795,60 +768,25 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                if( isRestartedSave )
                                {
                                        // Using the specific vmx file
-                                       System.out.print( "Changing VMX file after crash ... " ) ;
-                               
-                                       String[] command = new String[]{ "/bin/cp", 
-                                               working_directory + "/" + machine.getDirectory() + "/" + machine.getVmx_name_crash(),
-                                               working_directory + "/" + machine.getDirectory() + "/" + machine.getVmx_name() } ;
+                                       machine.setDeployFault( true ) ;
                                        
+                                       // Writing the restarted save mark
                                        try {
-                                               Process p = Runtime.getRuntime().exec( command ) ;
-                                               p.waitFor() ;
-                               
-                                               if( p.exitValue() == 0 )
-                                               {
-                                                       System.out.println( "Successfully replaced the VMX file." ) ;
-                                               } else {
-                                                       System.err.println( "Unsuccessful replacement of the VMX file!" ) ;
-//                                                     printProcessError( p.getErrorStream() ) ;
-                                                       printProcessError( p ) ;
-                                                       
-                                                       return 1 ;
-                                               }
-                                       } catch( IOException e ) {
-                                               System.err.println( "Error during VMX file replacement: " ) ;
-                                               e.printStackTrace() ;
-                                       } catch( InterruptedException e ) {
-                                               e.printStackTrace() ;
-                                       }
-                                       
-                                       // Removing lock files
-                                       System.out.print( "Removing lock files ... " ) ;
-                               
-                                       command = new String[]{ "/bin/rm", "-rf", 
-                                               working_directory + "/" + machine.getDirectory() 
-                                               + "/" + machine.getVmx_name() + ".lck" } ;
+                                               FileWriter fw = new FileWriter( new File( working_directory + "/" + machine.getDirectory() + "/fault.hpcvm" ) ) ;
+                                               fw.write( "fault!" ) ;
+                                               fw.flush() ;
+                                               fw.close() ;
+                                               fw = null ;
+                                       } catch( IOException e1 ) {
+                                               e1.printStackTrace() ;
+                                               System.err.println( "Unable to mark the fault!" ) ;
+                                       }       
                                        
-                                       try {
-                                               Process p = Runtime.getRuntime().exec( command ) ;
-                                               p.waitFor() ;
-                               
-                                               if( p.exitValue() == 0 )
-                                               {
-                                                       System.out.println( "Successfully deleted lock files." ) ;
-                                               } else {
-                                                       System.err.println( "Unsuccessful deletion of lock files!" ) ;
-//                                                     printProcessError( p.getErrorStream() ) ;
-                                                       printProcessError( p ) ;
-                                                       
-                                                       return 1 ;
-                                               }
-                                       } catch( IOException e ) {
-                                               System.err.println( "Error during lock files deletion: " ) ;
-                                               e.printStackTrace() ;
-                                       } catch( InterruptedException e ) {
-                                               e.printStackTrace() ;
+                                       if( machine.checkVmx() == 1 )
+                                       {
+                                               return 1 ;
                                        }
+                                       
                                
                                        /** Retrieving VM assigned IP **/
                                        String vmIP = null ;
@@ -870,7 +808,14 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                if( startVM( 0 ) == 0 ) 
                                {
                                        if( sendSaveOkVM() == 0 )
-                                       {
+                                       {                                               
+                                               try {
+                                                       LocalHost.Instance().getServerStub().restartOk( LocalHost.Instance().getIP() ) ;
+                                               } catch( RemoteException e ) {
+                                                       System.err.println( "Unable to inform server about my successful restart!" ) ;
+                                                       e.printStackTrace() ;
+                                               }
+                                               
                                                return 0 ;
                                        }
                                } else {
@@ -920,7 +865,6 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                return 0 ;
                        } else {
                                System.err.println( "Signal not sent!" ) ;
-//                             printProcessError( p.getErrorStream() ) ;
                                ret = printProcessError( p ) ;
                                
                                if( ! ret )
@@ -967,6 +911,8 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                System.out.println( "Saving VM ..." ) ;
                saveProcess.setStatus( true ) ;
                
+               long deb = System.currentTimeMillis() ;
+               
                machine.setStatus( "saving" ) ;
                try {
                        LocalHost.Instance().getServerStub().changeStatus( 
@@ -979,53 +925,61 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                String[] command ;
                String saveName = "" ;
                boolean error = false ;
-               boolean errorVM = false ;
                
-               if( suspendVM( 1 ) == 1 ) { error = true ; errorVM = true ; }
+               
+               if( suspendVM( 1 ) == 1 ) { return 1 ; }
+               
                
                if( ! lastSaveOk )
                {
-                       System.out.println( "Deletion of last nok archive ... " ) ;
+                       String arch = "" ;
+                       File file = new File( working_directory + "/" + machine.getName() + "_new_" + machine.getComputationId() + ".tar.gz" ) ;
+                       if( file.exists() )
+                       {
+                               arch = working_directory + "/" + machine.getName() + "_new_" + machine.getComputationId() + ".tar.gz" ;
+                       }
                        
-                       command = new String[]{ "/bin/rm", "-rf", 
-                                       working_directory + "/" + machine.getName() + "_new_" + machine.getComputationId() + ".tar",
-                                       working_directory + "/" + machine.getName() + "_new_" + machine.getComputationId() + ".tar.gz", } ;
+                       file = null ;
+                       
+                       if( arch.length() > 0 )
+                       {                       
+                               System.out.println( "Deletion of last nok archive ... " ) ;
+                       
+                               command = new String[]{ "/bin/rm", "-rf", arch } ;
                                                        
-                       try {
-                               procSave = Runtime.getRuntime().exec( command ) ;
-                               procSave.waitFor() ;
+                               try {
+                                       procSave = Runtime.getRuntime().exec( command ) ;
+                                       procSave.waitFor() ;
                                
-                               if( procSave.exitValue() == 0 )
-                               {
-                                       System.out.println( "Last nok archive successfully deleted." ) ;
-                               } else {
-                                       System.err.println( "Last nok archive not deleted!" ) ;
-//                                     printProcessError( p.getErrorStream() ) ;
-                                       printProcessError( procSave ) ;
+                                       if( procSave.exitValue() == 0 )
+                                       {
+                                               System.out.println( "Last nok archive successfully deleted." ) ;
+                                       } else {
+                                               System.err.println( "Last nok archive not deleted!" ) ;
+                                               printProcessError( procSave ) ;
                                        
+                                               error = true ;
+                                       }
+                               } catch( IOException e ) {
+                                       System.err.println( "Error during nok archive deletion command: " ) ;
+                                       error = true ;
+                                       e.printStackTrace() ;
+                               } catch( InterruptedException e ) {
+                                       e.printStackTrace() ;
                                        error = true ;
                                }
-                       } catch( IOException e ) {
-                               System.err.println( "Error during nok archive deletion command: " ) ;
-                               error = true ;
-                               e.printStackTrace() ;
-                       } catch( InterruptedException e ) {
-                               e.printStackTrace() ;
-                               error = true ;
                        }
                }
                
+               
                if( ! error )
                {
                        System.out.print( "Creation of the archive ... " ) ;
+                       
                        /** Archive creation **/
-//                     command = new String[]{ "/bin/tar", "-cf", 
-//                             working_directory + "/" + machine.getName() + "_new_" + machine.getComputationId() + ".tar",
-//                             working_directory + "/" + machine.getDirectory() } ;
-//                     
-                       command = new String[]{ "/bin/tar", "-cf", 
-                                       machine.getName() + "_new_" + machine.getComputationId() + ".tar",
-                                       machine.getDirectory(), "-C", working_directory } ;
+                       command = new String[]{ "/bin/tar", "-cz", "-C", working_directory,
+                                       "-f", working_directory + "/" + machine.getName() + "_new_" + machine.getComputationId() + ".tar.gz",
+                                       machine.getDirectory() } ;
                                
                        if( emergencyStop )
                        {
@@ -1044,7 +998,6 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                        
                                } else {
                                        System.err.println( "Archive not created!" ) ;
-//                                     printProcessError( p.getErrorStream() ) ;
                                        printProcessError( procSave ) ;
                                        
                                        error = true ;
@@ -1057,84 +1010,18 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                e.printStackTrace() ;
                                error = true ;
                        }
-               
-                       /** Compression of the archive **/
-                       if( ! error )
-                       {
-                               System.out.print( "Compression of the archive ... " ) ;
-                               command = new String[]{ "/bin/gzip", 
-                                               working_directory + "/" + machine.getName() 
-                                               + "_new_" + machine.getComputationId() + ".tar" } ;
-                               
-                               if( emergencyStop )
-                               {
-                                       return 1 ;
-                               }
-                               
-                               try {
-                                       procSave = Runtime.getRuntime().exec( command ) ;
-                                       procSave.waitFor() ;
                        
-                                       if( procSave.exitValue() == 0 )
-                                       {
-                                               System.out.println( "Archive successfully compressed." ) ;
-                                       } else {
-                                               System.err.println( "Archive not compressed!" ) ;
-//                                             printProcessError( p.getErrorStream() ) ;
-                                               printProcessError( procSave ) ;
-                                               
-                                               error = true ;
-                                       }
-                               } catch( IOException e ) {
-                                       System.err.println( "Error during archive compression command: " ) ;
-                                       e.printStackTrace() ;
-                                       error = true ;
-                               } catch( InterruptedException e ) {
-                                       e.printStackTrace() ;
-                                       error = true ;
-                               }
-                       }
+                       long fin = System.currentTimeMillis() ;
+                       
+                       System.out.println( "Time to create the save: " + (fin-deb)/1000 + " seconds." ) ;
                        
                        
                        /** Restarting VM **/
-                       if( errorVM || startVM( 0 ) == 1 ) { error = true ; }
+                       if( startVM( 0 ) == 1 ) { return 1 ; }
                        
                        
                        /** Sending ok save signal **/
-//                     if( ! error )
-//                     {
-                               if( sendSaveOkVM() == 1 ) { error = true ; }
-//                     }               
-                       
-//                     /** Deletion of the tar archive **/
-//                     if( ! error )
-//                     {
-//                             command = new String[]{ "/bin/rm", 
-//                                             working_directory + "/" + machine.getName() 
-//                                             + "_new_" + machine.getComputationId() + ".tar" } ;
-//                             
-//                             try {
-//                                     Process p = Runtime.getRuntime().exec( command ) ;
-//                                     p.waitFor() ;
-//                     
-//                                     if( p.exitValue() == 0 )
-//                                     {
-//                                             System.out.println( "Archive (not compressed) successfully deleted." ) ;
-//                                     } else {
-//                                             System.err.println( "Archive (not compressed) not deleted!" ) ;
-//                                             printProcessError( p.getErrorStream() ) ;
-//                                             
-//                                             error = true ;
-//                                     }
-//                             } catch( IOException e ) {
-//                                     System.err.println( "Error during archive (not compressed) deletion command: " ) ;
-//                                     e.printStackTrace() ;
-//                                     error = true ;
-//                             } catch( InterruptedException e ) {
-//                                     e.printStackTrace() ;
-//                                     error = true ;
-//                             }
-//                     }       
+                       if( sendSaveOkVM() == 1 ) { return 1 ; }
                
                        saveName = machine.getName() + "_new_" + machine.getComputationId() + ".tar.gz" ;       
                
@@ -1146,24 +1033,19 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                        return 1 ;
                                }
                                
-                               boolean ok = true ;
-                               
-                               ArrayList<ServicesClient> sn = machine.getSaveNeighbors() ;
+                               ArrayList<SaveNeighbor> sn = machine.getSaveNeighbors() ;
                                
                                for( int i = 0 ; i < sn.size() ; i++ )
                                {
-                                       System.out.print( "Sending save to " + sn.get( i ) + " ... " ) ;
-                                       try {
-                                               command = new String[]{ "/usr/bin/scp", working_directory + "/" + saveName,
-                                                               sn.get( i ).getIPHost() + ":" 
-                                                               + sn.get( i ).getWorkingDirectory() } ;
-                                       } catch( RemoteException e1 ) {
-                                               System.err.println( "Unable to retrieve save neighbor information!" ) ;
-                                               e1.printStackTrace() ;
-                                               ok = false ;
-                                       }
+                                       String name = sn.get( i ).getName() ;
+                                       String wd = sn.get( i ).getWorkingDirectory() ;
+                                       String snIP = sn.get( i ).getIPHost() ;
+                                       
+                                       System.out.print( "Sending save to " + name + " ... " ) ;
+                                       
+                                       command = new String[]{ "/usr/bin/scp", working_directory + "/" + saveName,
+                                                               snIP + ":" + wd } ;
                                
-                                       if( ok )
                                        try {
                                                procSave = Runtime.getRuntime().exec( command ) ;
                                                procSave.waitFor() ;
@@ -1173,7 +1055,6 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                                        System.out.println( "Archive successfully sent." ) ;
                                                } else {
                                                        System.err.println( "Archive not sent!" ) ;
-//                                                     printProcessError( p.getErrorStream() ) ;
                                                        printProcessError( procSave ) ;
                                                
                                                        error = true ;
@@ -1240,6 +1121,7 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                
                serverStub = null ;
                saveProcess = new SaveProcess() ;
+               saveRequest = new SaveRequest() ;
                
                machine = new VirtualMachine() ;
                
@@ -1260,11 +1142,11 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                maxRetryVM = 10 ;
                timeRetryVM = 10000 ;
                
-               save_interleave = 30 * 60 * 1000 ;
-               date_last_save = 0 ;
+//             save_interleave = 30 * 60 * 1000 ;
+//             date_last_save = 0 ;
                
                isRestartedSave = false ;
-               lastSaveOk = true ;
+               lastSaveOk = false ;
                
                /** Connection to server **/
                try {
@@ -1288,7 +1170,6 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                
                System.out.println( "Connected to server " + server_ip + " on port " + server_port + "." ) ;
                
-//             LocalHost.Instance().setServerIP( server_ip ) ;
                LocalHost.Instance().setServerStub( serverStub ) ;
                
                
@@ -1301,7 +1182,6 @@ public class Client extends UnicastRemoteObject implements ServicesClient
        
        private void exportObject() 
        {
-//             ServicesClient ref = null ;
                Registry reg = null ;
                
                try 
@@ -1365,7 +1245,7 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                while( (line = br.readLine()) != null )
                                {
                                        System.err.println( line ) ;
-                                       if( line.contains( "egmentation" ) ) 
+                                       if( line.contains( "egmentation" ) || _p.exitValue() == 139 
                                        {
                                                ret = true ;
                                        }
@@ -1378,6 +1258,13 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                return ret ;
        }
        
+       
+       @Override
+       public int echo()
+       {
+               return 0 ;
+       }
+       
 
        @Override
        public int start() 
@@ -1429,30 +1316,33 @@ public class Client extends UnicastRemoteObject implements ServicesClient
        
        private class PingServer extends Thread
        {
-               private boolean run ;
+               protected boolean go ;
                
                PingServer()
                {
-                       run = true ;
+                       go = true ;
                }
                
-               protected void stopPing() { run = false ; }
+               protected void stopPing() { go = false ; }
                
                @Override
                public void run() 
                {
-                       while( run )
+                       while( go )
                        {
                                try {
                                        LocalHost.Instance().getServerStub().ping( LocalHost.Instance().getIP() ) ;
-                               } catch (RemoteException e1) {
-                                       e1.printStackTrace();
+                               } catch( RemoteException e1 ) {
+                                       System.err.println( "Unable to ping the server!" ) ;
+                                       e1.printStackTrace() ;
+                                       yield() ;
                                }
                                
                                try {
-                                       Thread.sleep( 2000 ) ;
+                                       sleep( 2000 ) ;
                                } catch( InterruptedException e ) {
                                        e.printStackTrace() ;
+                                       yield() ;
                                }
                        }
                }
@@ -1461,32 +1351,26 @@ public class Client extends UnicastRemoteObject implements ServicesClient
        
        private class DialogVMServer extends Thread
        {
-               private boolean run ;
+               protected boolean go ;
                private Socket socket ;
-               private ArrayList<DialogVM> dialogs = new ArrayList<DialogVM>() ;
+//             private ArrayList<DialogVM> dialogs = new ArrayList<DialogVM>() ;
                
                DialogVMServer()
                {
-                       run = true ;
+                       go = true ;
                }
                
                protected void stopDialogVMServer() 
                { 
-                       run = false ;
+                       go = false ;
                        
                        if( serverSocket != null )
                        {
                                try {
-                                       serverSocket.close() ;
-//                                     socket = serverSocket.accept() ;
-                                       
-                                       for( int i = 0 ; i < dialogs.size() ; i++ )
-                                       {
-                                               dialogs.get( i ).stopDialogVM() ;
-                                       }
-                                       
+                                       serverSocket.close() ;                                  
                                } catch( IOException e ) {
                                        e.printStackTrace() ;
+                                       yield() ;
                                }
                        }                       
                }
@@ -1503,20 +1387,20 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                        } catch( IOException e ) {
                                System.err.println( "Unable to launch the SocketServer on port " + dialog_port + "!" ) ;
                                e.printStackTrace() ;
-                               
-                               run = false ;
+                               System.exit( 1 ) ;
                        }       
                        
-                       while( run )
+                       while( go )
                        {                               
                                try {
                                        socket = serverSocket.accept() ;
                                        
-                                       dialogs.add( new DialogVM( socket ) ) ;
-                                       dialogs.get( dialogs.size() - 1 ).start() ;     
+                                       new DialogVM( socket ).start() ;
+
                                } catch( IOException e ) {
                                        System.err.println( "Problem with the accept function!" ) ;
                                        e.printStackTrace() ;
+                                       yield() ;
                                }
                        }
                }
@@ -1525,24 +1409,11 @@ public class Client extends UnicastRemoteObject implements ServicesClient
        
        private class DialogVM extends Thread
        {
-               private boolean run ;
                private Socket socket ;
                private BufferedReader reader ;
                private String line ;
                
-               DialogVM( Socket _socket ) { run = true ; socket = _socket ; }
-       
-               protected void stopDialogVM()
-               {
-                       run = false ;
-
-                       try {
-                               reader.close() ; reader = null ;
-                               socket.close() ; socket = null ;
-                       } catch( IOException e ) {
-                               e.printStackTrace() ;
-                       }
-               }
+               DialogVM( Socket _socket ) { socket = _socket ; }
        
                @Override
                public void run() 
@@ -1551,89 +1422,129 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                reader = new BufferedReader( new InputStreamReader( socket.getInputStream() ) ) ;
                        } catch( IOException e ) {
                                System.err.println( "Unable to open a dialog socket with the VM!" ) ;
-                               e.printStackTrace();
-                               stopDialogVM() ;
+                               e.printStackTrace() ;
+                               yield() ;
                        }
-                       
-                       while( run )
-                       {
-                               try {
-                                       line = null ;
-                                       
-                                       if( reader != null )
+
+                       try {
+                               line = null ;
+
+                               if( reader != null )
+                               {
+                                       line = reader.readLine() ;
+                               }
+
+                               /** VM is starting -- retrieving informations **/
+                               if( line != null &&  line.equalsIgnoreCase( "infos" ) )
+                               {
+                                       /* Receiving name */
+                                       machine.setName( reader.readLine() ) ;
+
+                                       /* Receiving IP */
+                                       String ip = reader.readLine() ;
+                                       if( ! ip.equalsIgnoreCase( machine.getIp() ) )
                                        {
-                                               line = reader.readLine() ;
+                                               System.err.println( "VM IP not well configured!!" ) ;
                                        }
-                                       
-                                       /** VM is starting -- retrieving informations **/
-                                       if( run && line != null &&  line.equalsIgnoreCase( "infos" ) )
-                                       {
-                                               /* Receiving name */
-                                               machine.setName( reader.readLine() ) ;
-                                               
-                                               /* Receiving IP */
-                                               String ip = reader.readLine() ;
-                                               if( ! ip.equalsIgnoreCase( machine.getIp() ) )
-                                               {
-                                                       System.err.println( "VM IP not well configured!!" ) ;
-                                               }
-                                               
-                                               /* Close streams */
-                                               reader.close() ; reader = null ;
-                                               socket.close() ; socket = null ;
-                                               
-                                               run = false ;
-                                       }
-                                       
+
+                                       /* Close streams */
+                                       reader.close() ; reader = null ;
+                                       socket.close() ; socket = null ;
+
+                               } else if( line != null &&  line.equalsIgnoreCase( "save" ) ) {
                                        /** It's time to do a save **/
-                                       if( run && line != null &&  line.equalsIgnoreCase( "save" ) )
+
+                                       try {
+                                               machine.setComputationId( Integer.parseInt( reader.readLine() ) ) ;
+                                       } catch( Exception e ) {
+                                               System.err.println( "Problem while reading the computation id!" ) ;
+                                               e.printStackTrace() ;
+                                       }
+
+                                       synchronized( saveRequest ) 
                                        {
                                                try {
-                                                       machine.setComputationId( Integer.parseInt( reader.readLine() ) ) ;
-                                               } catch( Exception e ) {
-                                                       System.err.println( "Problem while reading the computation id!" ) ;
+                                                       LocalHost.Instance().getServerStub().requestSave( LocalHost.Instance().getIP() ) ;
+                                               } catch( RemoteException e ) {
+                                                       System.err.println( "Unable to request save to server!" ) ;
                                                        e.printStackTrace() ;
                                                }
-                                               
-                                               if( (System.currentTimeMillis() - date_last_save) > save_interleave )
-                                               {
-                                                       date_last_save = System.currentTimeMillis() ; 
-                                                       
-                                                       /* Close streams */
-                                                       reader.close() ; reader = null ;
-                                                       socket.close() ; socket = null ;
-                                                       
-                                                       run = false ;
-                                               
-                                                       /* Starting the VM save */
-                                                       saveVM() ;
-                                               } else {
-                                                       sendSaveOkVM() ;
-                                               }
-                                       }
-                                       
-                                       
-                                       /** Computation is done, we can shutdown the VM **/
-                                       if( run && line != null &&  line.equalsIgnoreCase( "quit" ) )
-                                       {
+
                                                try {
-                                                       Thread.sleep( 5000 ) ;
+                                                       saveRequest.wait() ;
                                                } catch( InterruptedException e ) {
-                                                       e.printStackTrace() ;
+                                                       e.printStackTrace();
                                                }
-                                               
+                                       }
+
+                                       if( saveRequest.getStatus() )
+                                       {
                                                /* Close streams */
                                                reader.close() ; reader = null ;
                                                socket.close() ; socket = null ;
-                                               
-                                               run = false ;
-                                               
-                                               stopVM() ;
+
+                                               saveRequest.setStatus( false ) ;
+
+                                               /* Requesting the VM save */
+                                               if( saveVM() == 1 )
+                                               {
+                                                       System.err.println( "Problem while saving. Exiting ..." ) ;
+                                                       pingServer.stopPing() ;
+                                                       emergencyStop() ;
+                                                       System.exit( 1 ) ;
+                                               }
+                                       } else {
+                                               sendSaveOkVM() ;
+                                       }
+                               } else if( line != null &&  line.equalsIgnoreCase( "quit" ) ) {
+                                       /** Computation is done, we can shutdown the VM **/
+
+                                       try {
+                                               Thread.sleep( 5000 ) ;
+                                       } catch( InterruptedException e ) {
+                                               e.printStackTrace() ;
+                                       }
+
+                                       /* Close streams */
+                                       reader.close() ; reader = null ;
+                                       socket.close() ; socket = null ;
+
+                                       stopVM() ;
+
+                                       machine.setStatus( "connected" ) ;
+                                       try {
+                                               LocalHost.Instance().getServerStub().changeStatus( 
+                                                               LocalHost.Instance().getIP(), "connected" ) ;
+                                       } catch( RemoteException e ) {
+                                               System.err.println( "Unable to inform the server of the VM status!" ) ;
+                                               e.printStackTrace() ;
                                        }
                                        
-                               } catch( IOException e ) {
-                                       e.printStackTrace() ;
+                                       try {
+                                               LocalHost.Instance().getServerStub().endApplication() ;
+                                       } catch( RemoteException e ) {
+                                               System.err.println( "Unable to inform the server of the end of application!" ) ;
+                                               e.printStackTrace() ;
+                                       }
+                               } else if( line != null &&  line.equalsIgnoreCase( "start" ) ) {
+                                       /** Computation is starting **/
+
+                                       /* Close streams */
+                                       reader.close() ; reader = null ;
+                                       socket.close() ; socket = null ;
+                                       System.out.println( "Application is starting." ) ;
+                                       
+                                       try {
+                                               LocalHost.Instance().getServerStub().goApplication() ;
+                                       } catch( RemoteException e ) {
+                                               System.err.println( "Unable to inform the server of the end of application!" ) ;
+                                               e.printStackTrace() ;
+                                       }
                                }
+
+                       } catch( IOException e ) {
+                               e.printStackTrace() ;
+                               yield() ;
                        }
                }
        }
@@ -1668,8 +1579,8 @@ public class Client extends UnicastRemoteObject implements ServicesClient
        @Override
        public void saveOk() 
        {
-               String save_name = machine.getName() + "_" + machine.getComputationId() +
-                       "_last.tar.gz" ;
+               String save_name = machine.getName() + "_last_" + machine.getComputationId() +
+                       ".tar.gz" ;
                
                String save_new = machine.getName() + "_new_" 
                  + machine.getComputationId() + ".tar.gz" ;
@@ -1689,7 +1600,6 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                        } else {
                                System.err.println( "Last save NOK!" ) ;
                                System.err.println( "Error: " ) ;
-//                             printProcessError( p.getErrorStream() ) ;
                                printProcessError( p ) ;
                        }
                } catch( IOException e ) {
@@ -1703,18 +1613,29 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                for( int i = 0 ; i < machine.getSaveNeighbors().size() ; i++ )
                {
                        try {
-                               machine.getSaveNeighbors().get( i ).changeSaveName( save_new, save_name, machine.getComputationId() ) ;
+                               machine.getSaveNeighbors().get( i ).getStub().changeSaveName( save_new, save_name, machine.getComputationId() ) ;
                        } catch( RemoteException e ) {
-                               try {
-                                       System.err.println( "Unable to change save name on " + machine.getSaveNeighbors().get( i ).getName() + "!" ) ;
-                               } catch( RemoteException e1 ) {
-                                       System.err.println( "Unable to change save name on an unamed save neighbor!" ) ;
-                                       e1.printStackTrace() ;
-                               }
+                               System.err.println( "Unable to change save name on " + machine.getSaveNeighbors().get( i ).getName() + "!" ) ;
                                e.printStackTrace() ;
                        }
                }
                
+               // Informing the server
+               int ret = 1 ;
+               try {
+                       ret = LocalHost.Instance().getServerStub().changeSaveName( LocalHost.Instance().getIP(), save_name ) ;
+               } catch( RemoteException e ) {
+                       System.err.println( "Unable to inform the server about the new save name!" ) ;
+                       e.printStackTrace() ;
+               }
+               
+               if( ret == 0 )
+               {
+                       System.out.println( "Successfully informing the server about the new save name." ) ;
+               } else {
+                       System.err.println( "Problem on the server while informing it about the new save name!" ) ;
+               }
+               
                // Ok here
                lastSaveOk = true ;
        }
@@ -1740,7 +1661,6 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                } else {
                                        System.err.println( "Change save name NOK!" ) ;
                                        System.err.println( "Error: " ) ;
-//                                     printProcessError( p.getErrorStream() ) ;
                                        printProcessError( p ) ;
                                }
                        } catch( IOException e ) {
@@ -1754,19 +1674,14 @@ public class Client extends UnicastRemoteObject implements ServicesClient
 
        
        @Override
-       public void setSavingNeighbor( ServicesClient _sn )
+       public void setSaveNeighbor( SaveNeighbor _sn )
        {
                if( _sn != null )
                {
-                       ArrayList<ServicesClient> as = new ArrayList<ServicesClient>() ;
+                       ArrayList<SaveNeighbor> as = new ArrayList<SaveNeighbor>() ;
                        as.add( _sn ) ;
                        
-                       try {
-                               System.out.println( "Save neighbor: " + _sn.getName() ) ;
-                       } catch( RemoteException e ) {
-                               System.err.println( "Unable to retrieve the name of the save neighbor!" ) ;
-                               e.printStackTrace() ;
-                       }
+                       System.out.println( "Save neighbor: " + _sn.getName() ) ;
                        
                        machine.setSaveNeighbors( as ) ;
                }
@@ -1774,19 +1689,14 @@ public class Client extends UnicastRemoteObject implements ServicesClient
        
        
        @Override
-       public void setSavingNeighbors( ArrayList<ServicesClient> _sn )
+       public void setSaveNeighbors( ArrayList<SaveNeighbor> _sn )
        {
                if( _sn != null && _sn.size() > 0 )
                {
                        System.out.print( "Save neighbors: " ) ;
                        for( int i = 0 ; i < _sn.size() ; i++ )
                        {
-                               try {
-                                       System.out.print( _sn.get( i ).getName() ) ;
-                               } catch( RemoteException e ) {
-                                       System.err.println( "Unable to retrieve the name of a save neighbor!" ) ;
-                                       e.printStackTrace() ;
-                               }
+                               System.out.print( _sn.get( i ).getName() ) ;
                                
                                if( i != _sn.size() - 1 )
                                {
@@ -1802,16 +1712,11 @@ public class Client extends UnicastRemoteObject implements ServicesClient
 
        
        @Override
-       public void addSavingNeighbor( ServicesClient _sn )
+       public void addSaveNeighbor( SaveNeighbor _sn )
        {
                if( _sn != null )
                {
-                       try {
-                               System.out.println( "Adding save neighbor: " + _sn.getName() ) ;
-                       } catch( RemoteException e ) {
-                               System.err.println( "Unable to retrieve the name of a save neighbor!" ) ;
-                               e.printStackTrace() ;
-                       }
+                       System.out.println( "Adding save neighbor: " + _sn.getName() ) ;
                        
                        machine.getSaveNeighbors().add( _sn ) ;
                }
@@ -1819,20 +1724,15 @@ public class Client extends UnicastRemoteObject implements ServicesClient
        
        
        @Override
-       public void addSavingNeighbors( ArrayList<ServicesClient> _sn )
+       public void addSaveNeighbors( ArrayList<SaveNeighbor> _sn )
        {
                if( _sn != null && _sn.size() > 0 )
                {
                        System.out.print( "Adding save neighbors: " ) ;
                        for( int i = 0 ; i < _sn.size() ; i++ )
                        {
-                               try {
-                                       System.out.print( _sn.get( i ).getName() ) ;
-                               } catch( RemoteException e ) {
-                                       System.err.println( "Unable to retrieve the name of a save neighbor!" ) ;
-                                       e.printStackTrace() ;
-                               }
-                               
+                               System.out.print( _sn.get( i ).getName() ) ;
+                                                       
                                if( i != _sn.size() - 1 )
                                {
                                        System.out.print( ", " ) ;
@@ -1847,29 +1747,26 @@ public class Client extends UnicastRemoteObject implements ServicesClient
        
        
        @Override
-       public void replaceSavingNeighbor( ServicesClient _old, ServicesClient _new )
+       public void replaceSaveNeighbor( SaveNeighbor _old, SaveNeighbor _new )
        {
                System.out.print( "Replacing a save neihgbor ... " ) ;
                if( _old != null && _new != null )
                {
                        int i = 0 ;
+                       boolean change = false ;
                        
                        for( i = 0 ; i < machine.getSaveNeighbors().size() ; i++ )
                        {
-                               try {
-                                       if( machine.getSaveNeighbors().get( i ).getIPHost().equalsIgnoreCase( _old.getIPVM() ) )
-                                       {
-                                               machine.getSaveNeighbors().set( i, _new ) ;
-                                               System.out.println( "Save neighbor successfully changed." ) ;
-                                               break ;
-                                       }
-                               } catch( RemoteException e ) {
-                                       System.err.println( "Unable to retrieve the IP address of a save neighbor!" ) ;
-                                       e.printStackTrace() ;
+                               if( machine.getSaveNeighbors().get( i ).getIPHost().equalsIgnoreCase( _old.getIPHost() ) )
+                               {
+                                       machine.getSaveNeighbors().set( i, _new ) ;
+                                       System.out.println( "Save neighbor successfully changed." ) ;
+                                       change = true ;
+                                       break ;
                                }
                        }
                        
-                       if( i == machine.getSaveNeighbors().size() )
+                       if( ! change )
                        {
                                System.out.println( "I am not concerned by the modification." ) ;
                        }
@@ -1891,36 +1788,21 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                        }
                        
                        // TODO NEIGHBORS !!!!
-                       //System.out.println( "!!!! NEIGHBORS !!!!!" ) ;
                        boolean ok = false ;
-                       boolean go = true ;
                        int i = 0 ;
                        
                        while( ! ok && i < machine.getSaveNeighbors().size() )
                        {
-                               try {
-                                       System.out.print( "Retrieving a save on " + machine.getSaveNeighbors().get( 0 ).getName() + " ... " ) ;
-                               } catch( RemoteException e1 ) {
-                                       System.err.println( "Unable to retrieve the name of a save neighbor!" ) ;
-                                       e1.printStackTrace() ;
-                               }
+                               System.out.print( "Retrieving a save on " + machine.getSaveNeighbors().get( 0 ).getName() + " ... " ) ;
                                
                                String command[] = {} ;
                                
-                               try
-                               {
-                                       command = new String[]{ "/usr/bin/scp", 
-                                                       machine.getSaveNeighbors().get( i ).getIPHost() + ":" +
-                                                       machine.getSaveNeighbors().get( i ).getWorkingDirectory() + "/" +
-                                                       machine.getSave_last(),
-                                                       working_directory } ;
-                               } catch( RemoteException e1 ) {
-                                       System.err.println( "Unable to retrieve the name of a save neighbor!" ) ;
-                                       e1.printStackTrace() ;
-                                       go = false ;
-                               }       
+                               command = new String[]{ "/usr/bin/scp", 
+                                               machine.getSaveNeighbors().get( i ).getIPHost() + ":" +
+                                               machine.getSaveNeighbors().get( i ).getWorkingDirectory() + "/" +
+                                               machine.getSave_last(),
+                                               working_directory } ;
                                
-                               if( go )
                                try {
                                        Process p = Runtime.getRuntime().exec( command ) ;
                                        p.waitFor() ;
@@ -1933,17 +1815,14 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                                        } else {
                                                System.err.println( "Archive not retrieved!" ) ;
                                                System.err.println( "Error: " ) ; 
-//                                             printProcessError( p.getErrorStream() ) ;
+
                                                printProcessError( p ) ;
-//                                             error = true ;
                                        }
                                } catch( IOException e ) {
                                        System.err.println( "Error during archive retrieve command: " ) ;
                                        e.printStackTrace() ;
-//                                     error = true ;
                                } catch( InterruptedException e ) {
                                        e.printStackTrace() ;
-//                                     error = true ;
                                }
                                
                                i++ ;
@@ -1961,6 +1840,7 @@ public class Client extends UnicastRemoteObject implements ServicesClient
                
        }
 
+       
        @Override
        public String getIPVM() throws RemoteException 
        {
@@ -1990,6 +1870,69 @@ public class Client extends UnicastRemoteObject implements ServicesClient
        }
        
        
+       public Integer deployVM( String _name, String _archive, String _directory )
+       {
+               if( _name != null && _name.length() > 0 && _archive != null && _name.length() > 0 )
+               {
+                       File file = new File( working_directory + "/" + _archive ) ;
+                       if( ! file.exists() )
+                       {
+                               System.err.println( "There is no archive named " + _archive + " in my working directory!" ) ;
+                               file = null ;
+                               return 2 ;
+                       } else if( file.isDirectory() ) {
+                               System.err.println( _archive + " is a directory!" ) ;
+                               file = null ;
+                               return 1 ;
+                       }
+                       
+                       file = null ;
+                       
+                       machine.setName( _name ) ;
+                       machine.setInitial_archive_name( _archive ) ;
+                       machine.setDirectory( _directory ) ;
+                       
+                       if( machine.deployInitialVM() == 1 ) 
+                       {
+                               System.err.println( "Unable to deploy the initial VM archive!" ) ;
+                       } else {                                
+                               return 0 ;
+                       }
+               }
+               
+               return 1 ;
+       }
+       
+       
+       @Override
+       public void responseSave( boolean _b )
+       {
+               synchronized( saveRequest )
+               {
+                       saveRequest.setStatus( _b ) ;
+                       try {
+                               saveRequest.notifyAll() ;
+                       } catch( Exception e ) {
+                               e.printStackTrace() ;
+                       }
+               }
+       }
+       
+       
+       private class SaveRequest
+       {
+               boolean status ;
+               
+               SaveRequest()
+               {
+                       status = false ;
+               }
+               
+               protected boolean getStatus() { return status ; }
+               
+               protected void setStatus( boolean _b ) { status = _b ; }
+       }
+       
        private class SaveProcess
        {
                boolean status ;