Skip to content

Commit 25a3a37

Browse files
committed
fix ceph backup error handling and timeout
1 parent 2c82750 commit 25a3a37

1 file changed

Lines changed: 34 additions & 21 deletions

File tree

hasadna_k8s/ceph/pvc_backup.py

Lines changed: 34 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,27 +17,40 @@ def main_block(namespace, pvc_name, pv):
1717
backup_name = f'hasadna-k8s-pvc-backup-{backup_datestr}'
1818
print(f'Backup name: {backup_name}')
1919
subprocess.check_call(['rbd', 'snap', 'create', f'{pool}/{image_name}@{backup_name}'])
20-
subprocess.check_call(['rbd', 'snap', 'protect', f'{pool}/{image_name}@{backup_name}'])
21-
clone_name = f'hasadna-k8s-pvc-backup-{backup_name}'
22-
print(f'Clone name: {clone_name}')
23-
subprocess.check_call(['rbd', 'clone', f'{pool}/{image_name}@{backup_name}', f'{pool}/{clone_name}'])
24-
device = subprocess.check_output(['rbd-nbd', 'map', f'{pool}/{clone_name}']).decode().strip()
25-
print(f'Device: {device}')
26-
if subprocess.call(['e2fsck', '-yf', device]) != 0:
27-
print(f"WARNING! e2fsck fixed some errors on namespace '{namespace}', pvc '{pvc_name}'")
28-
subprocess.check_call(['mkdir', '-p', f'/tmp{device}'])
29-
subprocess.check_call(['mount', '-t', 'ext4', '-o', 'ro', device, f'/tmp{device}'])
30-
kopia_snapshot_source = f'ceph@{namespace}:{pvc_name}'
31-
print(f'Creating Kopia snapshot with source {kopia_snapshot_source}...')
32-
subprocess.check_call(['kopia', 'snapshot', 'create', f'/tmp{device}', '--override-source', kopia_snapshot_source])
33-
print("Kopia snapshot created successfully.")
34-
print('Unmounting and cleaning up...')
35-
subprocess.check_call(['umount', f'/tmp{device}'])
36-
subprocess.check_call(['rbd-nbd', 'unmap', device])
37-
subprocess.check_call(['rbd', 'rm', f'{pool}/{clone_name}'])
38-
subprocess.check_call(['rbd', 'snap', 'unprotect', f'{pool}/{image_name}@{backup_name}'])
39-
subprocess.check_call(['rbd', 'snap', 'rm', f'{pool}/{image_name}@{backup_name}'])
40-
print('Backup completed successfully.')
20+
try:
21+
subprocess.check_call(['rbd', 'snap', 'protect', f'{pool}/{image_name}@{backup_name}'])
22+
try:
23+
clone_name = f'hasadna-k8s-pvc-backup-{backup_name}'
24+
print(f'Clone name: {clone_name}')
25+
subprocess.check_call(['rbd', 'clone', f'{pool}/{image_name}@{backup_name}', f'{pool}/{clone_name}'])
26+
try:
27+
device = subprocess.check_output(['rbd-nbd', 'map', f'{pool}/{clone_name}']).decode().strip()
28+
print(f'Device: {device}')
29+
try:
30+
if subprocess.call(['e2fsck', '-yf', device]) != 0:
31+
print(f"WARNING! e2fsck fixed some errors on namespace '{namespace}', pvc '{pvc_name}'")
32+
subprocess.check_call(['mkdir', '-p', f'/tmp{device}'])
33+
subprocess.check_call(['mount', '-t', 'ext4', '-o', 'ro', device, f'/tmp{device}'])
34+
try:
35+
kopia_snapshot_source = f'ceph@{namespace}:{pvc_name}'
36+
print(f'Creating Kopia snapshot with source {kopia_snapshot_source}...')
37+
subprocess.check_call(['kopia', 'snapshot', 'create', f'/tmp{device}', '--override-source', kopia_snapshot_source])
38+
print("Kopia snapshot created successfully.")
39+
finally:
40+
if subprocess.call(['umount', f'/tmp{device}']) != 0:
41+
print(f"ERROR! Failed to unmount device {device} for namespace '{namespace}', pvc '{pvc_name}'")
42+
finally:
43+
if subprocess.call(['rbd-nbd', 'unmap', device]) != 0:
44+
print(f"ERROR! Failed to unmap device {device} for namespace '{namespace}', pvc '{pvc_name}'")
45+
finally:
46+
if subprocess.call(['rbd', 'rm', f'{pool}/{clone_name}']) != 0:
47+
print(f"ERROR! Failed to remove clone {clone_name} for namespace '{namespace}', pvc '{pvc_name}'")
48+
finally:
49+
if subprocess.call(['rbd', 'snap', 'unprotect', f'{pool}/{image_name}@{backup_name}']) != 0:
50+
print(f"ERROR! Failed to unprotect snapshot {backup_name} for namespace '{namespace}', pvc '{pvc_name}'")
51+
finally:
52+
if subprocess.call(['rbd', 'snap', 'rm', f'{pool}/{image_name}@{backup_name}']) != 0:
53+
print(f"ERROR! Failed to remove snapshot {backup_name} for namespace '{namespace}', pvc '{pvc_name}'")
4154

4255

4356
def main_shared(namespace, pvc_name, pv):

0 commit comments

Comments
 (0)