@@ -201,18 +201,6 @@ def perform_backup(self, vm_id: str, vm_name: str, backup_type: str, hd: str) ->
201
201
# Create or update latest symlink
202
202
latest_dir = backup_dir / "latest"
203
203
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
-
216
204
def do_backup ():
217
205
# For full backups, clear bitmaps first
218
206
if backup_level == "full" :
@@ -250,7 +238,6 @@ def do_backup():
250
238
f"Running: qmpbackup --socket { abs_qmp_socket } backup -i { hd } --no-subdir -t { abs_latest_dir } -l { backup_level } " )
251
239
if qmp_socket .exists ():
252
240
try :
253
- backup_lock .touch (exist_ok = False )
254
241
# Use Popen for real-time output
255
242
process = subprocess .Popen (
256
243
[
@@ -285,24 +272,47 @@ def do_backup():
285
272
except Exception as e :
286
273
logger .error (f"Error performing backup: { e } " )
287
274
return False
288
- finally :
289
- backup_lock .unlink ()
290
275
else :
291
276
logger .error (f"QMP socket not found at { qmp_socket } " )
292
277
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
+
293
286
try :
294
- suc = do_backup ()
287
+ backup_lock .touch (exist_ok = False )
288
+ locked = True
295
289
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 )} " )
290
+ logger .error (f"Error creating backup lock: { e } " )
291
+ locked = False
292
+ if locked :
302
293
try :
303
- shutil . rmtree ( backup_timestamp_dir )
294
+ suc = do_backup ( )
304
295
except Exception as e :
305
- logger .error (f"Error removing old backup: { e } " )
296
+ logger .error (f"Error performing backup: { e } " )
297
+ suc = False
298
+ finally :
299
+ backup_lock .unlink ()
300
+ else :
301
+ suc = False
302
+ if backup_type == "full" :
303
+ if not suc :
304
+ logger .info (
305
+ f"Removing { os .path .basename (backup_timestamp_dir )} " )
306
+ try :
307
+ shutil .rmtree (backup_timestamp_dir )
308
+ except Exception as e :
309
+ logger .error (f"Error removing old backup: { e } " )
310
+ else :
311
+ try :
312
+ latest_dir .unlink ()
313
+ except FileNotFoundError :
314
+ pass
315
+ latest_dir .symlink_to (timestamp )
306
316
307
317
return suc
308
318
0 commit comments