@@ -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,48 @@ 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
+ try :
286
+ latest_dir .unlink ()
287
+ except FileNotFoundError :
288
+ pass
289
+ latest_dir .symlink_to (timestamp )
290
+
293
291
try :
294
- suc = do_backup ()
292
+ backup_lock .touch (exist_ok = False )
293
+ locked = True
295
294
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 :
302
298
try :
303
- shutil . rmtree ( backup_timestamp_dir )
299
+ suc = do_backup ( )
304
300
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
306
317
307
318
return suc
308
319
0 commit comments