@@ -201,18 +201,6 @@ def perform_backup(self, vm_id: str, vm_name: str, backup_type: str, hd: str) ->
201201 # Create or update latest symlink
202202 latest_dir = backup_dir / "latest"
203203
204- if backup_level == "full" :
205- # Create timestamped directory for this backup
206- timestamp = datetime .now ().strftime ("%Y%m%dT%H%M%S" )
207- backup_timestamp_dir = backup_dir / f"{ timestamp } "
208- logger .info (f"Creating backup directory: { backup_timestamp_dir } " )
209- backup_timestamp_dir .mkdir (parents = True , exist_ok = True )
210- try :
211- latest_dir .unlink ()
212- except FileNotFoundError :
213- pass
214- latest_dir .symlink_to (timestamp )
215-
216204 def do_backup ():
217205 # For full backups, clear bitmaps first
218206 if backup_level == "full" :
@@ -250,7 +238,6 @@ def do_backup():
250238 f"Running: qmpbackup --socket { abs_qmp_socket } backup -i { hd } --no-subdir -t { abs_latest_dir } -l { backup_level } " )
251239 if qmp_socket .exists ():
252240 try :
253- backup_lock .touch (exist_ok = False )
254241 # Use Popen for real-time output
255242 process = subprocess .Popen (
256243 [
@@ -285,24 +272,48 @@ def do_backup():
285272 except Exception as e :
286273 logger .error (f"Error performing backup: { e } " )
287274 return False
288- finally :
289- backup_lock .unlink ()
290275 else :
291276 logger .error (f"QMP socket not found at { qmp_socket } " )
292277 return False
278+
279+ if backup_level == "full" :
280+ # Create timestamped directory for this backup
281+ timestamp = datetime .now ().strftime ("%Y%m%dT%H%M%S" )
282+ backup_timestamp_dir = backup_dir / f"{ timestamp } "
283+ logger .info (f"Creating backup directory: { backup_timestamp_dir } " )
284+ backup_timestamp_dir .mkdir (parents = True , exist_ok = True )
285+ try :
286+ latest_dir .unlink ()
287+ except FileNotFoundError :
288+ pass
289+ latest_dir .symlink_to (timestamp )
290+
293291 try :
294- suc = do_backup ()
292+ backup_lock .touch (exist_ok = False )
293+ locked = True
295294 except Exception as e :
296- logger .error (f"Error performing backup: { e } " )
297- suc = False
298- if not suc and backup_type == "full" :
299- # Remove the latest backup dir suc = self.perform_backup(vm_id, vm_name, "incremental", hd)
300- logger .info (
301- f"Removing { os .path .basename (backup_timestamp_dir )} " )
295+ logger .error (f"Error creating backup lock: { e } " )
296+ locked = False
297+ if locked :
302298 try :
303- shutil . rmtree ( backup_timestamp_dir )
299+ suc = do_backup ( )
304300 except Exception as e :
305- logger .error (f"Error removing old backup: { e } " )
301+ logger .error (f"Error performing backup: { e } " )
302+ suc = False
303+ finally :
304+ backup_lock .unlink ()
305+ else :
306+ suc = False
307+ if backup_type == "full" :
308+ if not suc :
309+ logger .info (
310+ f"Removing { os .path .basename (backup_timestamp_dir )} " )
311+ try :
312+ shutil .rmtree (backup_timestamp_dir )
313+ except Exception as e :
314+ logger .error (f"Error removing old backup: { e } " )
315+ else :
316+ pass
306317
307318 return suc
308319
0 commit comments