backup: use a thread to send data to AppVM in parallel to tar main operations.
Additionnally, temporary files are removed once data has been sent
This commit is contained in:
		
							parent
							
								
									a85f3a7d8e
								
							
						
					
					
						commit
						23065f6fa0
					
				| @ -1068,6 +1068,40 @@ def backup_do_copy(base_backup_dir, files_to_backup, progress_callback = None, e | |||||||
| 
 | 
 | ||||||
|     print "Will backup:",files_to_backup |     print "Will backup:",files_to_backup | ||||||
| 
 | 
 | ||||||
|  |     # Setup worker to send encrypted data chunks to the backup_target | ||||||
|  |     from multiprocessing import Queue,Process | ||||||
|  |     class Send_Worker(Process): | ||||||
|  |         def __init__(self,queue,base_dir,backup_stdout): | ||||||
|  |             super(Send_Worker, self).__init__() | ||||||
|  |             self.queue = queue | ||||||
|  |             self.base_dir = base_dir | ||||||
|  |             self.backup_stdout = backup_stdout | ||||||
|  | 
 | ||||||
|  |         def run(self): | ||||||
|  |             print "Started sending thread" | ||||||
|  | 
 | ||||||
|  |             print "Moving to temporary dir",self.base_dir | ||||||
|  |             os.chdir(self.base_dir) | ||||||
|  | 
 | ||||||
|  |             for filename in iter(self.queue.get,None): | ||||||
|  |                 if filename == "FINISHED": | ||||||
|  |                     break | ||||||
|  | 
 | ||||||
|  |                 print "Sending file",filename | ||||||
|  |                 tar_final_cmd = ["tar", "-cO", "-C", self.base_dir, filename] | ||||||
|  |                 final_proc  = subprocess.Popen (tar_final_cmd, stdin=subprocess.PIPE, stdout=self.backup_stdout) | ||||||
|  |                 final_proc.wait() | ||||||
|  |              | ||||||
|  |                 # Delete the file as we don't need it anymore | ||||||
|  |                 print "Removing file",filename | ||||||
|  |                 os.remove(filename) | ||||||
|  | 
 | ||||||
|  |             print "Finished sending thread" | ||||||
|  |   | ||||||
|  |     to_send    = Queue() | ||||||
|  |     send_proc = Send_Worker(to_send, backup_tmpdir, backup_stdout) | ||||||
|  |     send_proc.start() | ||||||
|  | 
 | ||||||
|     for filename in files_to_backup: |     for filename in files_to_backup: | ||||||
|         print "Backing up",filename |         print "Backing up",filename | ||||||
| 
 | 
 | ||||||
| @ -1117,9 +1151,10 @@ def backup_do_copy(base_backup_dir, files_to_backup, progress_callback = None, e | |||||||
|                 raise QubesException("Failed to perform backup: error with "+run_error) |                 raise QubesException("Failed to perform backup: error with "+run_error) | ||||||
| 
 | 
 | ||||||
|             # Send the chunk to the backup target |             # Send the chunk to the backup target | ||||||
|             tar_final_cmd = ["tar", "-cO", "-C", backup_tmpdir, chunkfile.split(os.path.normpath(backup_tmpdir)+"/")[1]] |             to_send.put(chunkfile.split(os.path.normpath(backup_tmpdir)+"/")[1]) | ||||||
|             final_proc  = subprocess.Popen (tar_final_cmd, stdin=subprocess.PIPE, stdout=backup_stdout) |             #tar_final_cmd = ["tar", "-cO", "-C", backup_tmpdir, chunkfile.split(os.path.normpath(backup_tmpdir)+"/")[1]] | ||||||
|             final_proc.wait() |             #final_proc  = subprocess.Popen (tar_final_cmd, stdin=subprocess.PIPE, stdout=backup_stdout) | ||||||
|  |             #final_proc.wait() | ||||||
| 
 | 
 | ||||||
|             # Close HMAC |             # Close HMAC | ||||||
|             hmac.stdin.close() |             hmac.stdin.close() | ||||||
| @ -1135,9 +1170,10 @@ def backup_do_copy(base_backup_dir, files_to_backup, progress_callback = None, e | |||||||
|             hmac_file.close() |             hmac_file.close() | ||||||
| 
 | 
 | ||||||
|             # Send the HMAC to the backup target |             # Send the HMAC to the backup target | ||||||
|             tar_final_cmd = ["tar", "-cO", "-C", backup_tmpdir, chunkfile.split(os.path.normpath(backup_tmpdir)+"/")[1]+".hmac"] |             to_send.put(chunkfile.split(os.path.normpath(backup_tmpdir)+"/")[1]+".hmac") | ||||||
|             final_proc  = subprocess.Popen (tar_final_cmd, stdin=subprocess.PIPE, stdout=backup_stdout) |             #tar_final_cmd = ["tar", "-cO", "-C", backup_tmpdir, chunkfile.split(os.path.normpath(backup_tmpdir)+"/")[1]+".hmac"] | ||||||
|             final_proc.wait() |             #final_proc  = subprocess.Popen (tar_final_cmd, stdin=subprocess.PIPE, stdout=backup_stdout) | ||||||
|  |             #final_proc.wait() | ||||||
|              |              | ||||||
|             if tar_sparse.poll() == None: |             if tar_sparse.poll() == None: | ||||||
|                 # Release the next chunk |                 # Release the next chunk | ||||||
| @ -1148,18 +1184,13 @@ def backup_do_copy(base_backup_dir, files_to_backup, progress_callback = None, e | |||||||
|             else: |             else: | ||||||
|                 print "Finished tar sparse with error",tar_sparse.poll() |                 print "Finished tar sparse with error",tar_sparse.poll() | ||||||
|              |              | ||||||
|         # Wait for all remaining subprocess to finish |  | ||||||
|         #if addproc: |  | ||||||
|         #    addproc.wait() |  | ||||||
|         #    print "Addproc:",addproc.poll() |  | ||||||
| 
 |  | ||||||
|         #streamproc.wait() |  | ||||||
|         #print "Streamproc:",streamproc.poll() |  | ||||||
| 
 |  | ||||||
|         #streamproc.wait() |  | ||||||
|          |          | ||||||
|     # Close the backup target and wait for it to finish |     # Close the backup target and wait for it to finish | ||||||
|     #backup_stdout.close() |     #backup_stdout.close() | ||||||
|  | 
 | ||||||
|  |     to_send.put("FINISHED") | ||||||
|  |     send_proc.join() | ||||||
|  | 
 | ||||||
|     if vmproc: |     if vmproc: | ||||||
|         print "VMProc1:",vmproc.poll() |         print "VMProc1:",vmproc.poll() | ||||||
|         print "Sparse1:",tar_sparse.poll() |         print "Sparse1:",tar_sparse.poll() | ||||||
| @ -1189,7 +1220,7 @@ def wait_backup_feedback(progress_callback, streamproc, backup_target, total_bac | |||||||
|         blocks_backedup += len(buffer) |         blocks_backedup += len(buffer) | ||||||
| 
 | 
 | ||||||
|         progress = blocks_backedup / float(total_backup_sz) |         progress = blocks_backedup / float(total_backup_sz) | ||||||
|         #progress_callback(round(progress*100,2)) |         progress_callback(round(progress*100,2)) | ||||||
| 
 | 
 | ||||||
|         run_count = 0 |         run_count = 0 | ||||||
|         if hmac: |         if hmac: | ||||||
| @ -1202,7 +1233,7 @@ def wait_backup_feedback(progress_callback, streamproc, backup_target, total_bac | |||||||
| 
 | 
 | ||||||
|         if addproc: |         if addproc: | ||||||
|             retcode=addproc.poll() |             retcode=addproc.poll() | ||||||
|             print "Tar proc status:",retcode |             #print "Tar proc status:",retcode | ||||||
|             if retcode != None: |             if retcode != None: | ||||||
|                 if retcode != 0: |                 if retcode != 0: | ||||||
|                     run_error = "addproc" |                     run_error = "addproc" | ||||||
| @ -1231,7 +1262,7 @@ def wait_backup_feedback(progress_callback, streamproc, backup_target, total_bac | |||||||
| 
 | 
 | ||||||
|                 run_count += 1 |                 run_count += 1 | ||||||
|         else: |         else: | ||||||
|             print "Process running:",len(buffer) |             #print "Process running:",len(buffer) | ||||||
|             # Process still running |             # Process still running | ||||||
|             backup_target.write(buffer) |             backup_target.write(buffer) | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Olivier MEDOC
						Olivier MEDOC