Skip to content

Commit e5b5abb

Browse files
authored
B #7918: Clean up Ceph backup snapshots on failure (#4321)
Two fixes for temporary RBD snapshots left over by failed backups: - Remove a stale snapshot with the same name before 'rbd snap create' - Add an EXIT trap to the generated backup script that removes the snapshots created by the failed run.
1 parent e13f03e commit e5b5abb

2 files changed

Lines changed: 46 additions & 13 deletions

File tree

src/tm_mad/lib/backup.rb

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,9 @@ def backup_disks_sh(options = {})
4949
snap_cmd = ''
5050
expo_cmd = ''
5151

52-
snap_clup = ''
53-
expo_clup = ''
52+
snap_clup = ''
53+
expo_clup = ''
54+
snap_abort = ''
5455
onebex_cmd = ''
5556

5657
xml_vm = REXML::Document.new(@xml).root
@@ -79,10 +80,11 @@ def backup_disks_sh(options = {})
7980
cmds = d.backup_cmds(backup_dir, ds, live, disk_format)
8081
return nil unless cmds
8182

82-
snap_cmd << cmds[:snapshot].to_s
83-
expo_cmd << cmds[:export].to_s
84-
snap_clup << cmds[:snapshot_clup].to_s
85-
expo_clup << cmds[:export_clup].to_s
83+
snap_cmd << cmds[:snapshot].to_s
84+
expo_cmd << cmds[:export].to_s
85+
snap_clup << cmds[:snapshot_clup].to_s
86+
expo_clup << cmds[:export_clup].to_s
87+
snap_abort << cmds[:snapshot_abort].to_s
8688

8789
next unless cmds[:start_onebex]
8890

@@ -103,6 +105,23 @@ def backup_disks_sh(options = {})
103105
<<~EOS
104106
set -ex -o pipefail
105107
108+
# ---------------------------------------------------------
109+
# Remove disk snapshots created by this backup on failure
110+
# ---------------------------------------------------------
111+
abort_cleanup() {
112+
rc=$?
113+
114+
[ "$rc" = "0" ] && exit 0
115+
116+
set +e
117+
118+
#{snap_abort}
119+
120+
exit "$rc"
121+
}
122+
123+
trap abort_cleanup EXIT
124+
106125
# ----------------------
107126
# Prepare backup folder
108127
# ----------------------

src/tm_mad/lib/ceph.rb

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -141,8 +141,9 @@ def backup_cmds(backup_dir, ds, live, format = nil)
141141
snap_cmd = ''
142142
expo_cmd = ''
143143

144-
snap_clup = ''
145-
expo_clup = ''
144+
snap_clup = ''
145+
expo_clup = ''
146+
snap_abort = ''
146147

147148
backup_util = '/var/tmp/one/tm/lib/backup_rbd.rb'
148149

@@ -154,12 +155,16 @@ def backup_cmds(backup_dir, ds, live, format = nil)
154155
if live
155156
snapshot = "#{@rbd_image}@one_backup"
156157

158+
# Remove stale snapshot left over by a failed backup
159+
snap_cmd << rm_snaps_sh({ :type => :eq, :text => 'one_backup' })
157160
snap_cmd << "#{@rbd_cmd} snap create #{snapshot}\n"
158161
expo_cmd << ds.cmd_confinement(
159162
"#{@rbd_cmd} export #{snapshot} #{draw}\n",
160163
backup_dir
161164
)
162165
snap_clup << "#{@rbd_cmd} snap rm #{snapshot}\n"
166+
167+
snap_abort << rm_snaps_sh({ :type => :eq, :text => 'one_backup' })
163168
else
164169
expo_cmd << ds.cmd_confinement(
165170
"#{@rbd_cmd} export #{@rbd_image} #{draw}\n",
@@ -195,6 +200,8 @@ def backup_cmds(backup_dir, ds, live, format = nil)
195200
"ruby #{backup_util} #{@rbd_image} NONE #{snapshot} #{dexp}\n",
196201
backup_dir
197202
)
203+
204+
snap_abort << rm_snaps_sh({ :type => :prefix, :text => INC_SNAP_PREFIX })
198205
else
199206
# Incremental backup
200207
incid = @vm_backup_config[:last_increment] + 1
@@ -204,6 +211,8 @@ def backup_cmds(backup_dir, ds, live, format = nil)
204211

205212
last_snap = "one_backup_#{@vm_backup_config[:last_increment]}"
206213

214+
# Remove stale snapshot left over by a failed backup
215+
snap_cmd << rm_snaps_sh({ :type => :eq, :text => "one_backup_#{incid}" })
207216
snap_cmd << "#{@rbd_cmd} snap create #{snapshot}\n"
208217
snap_cmd << "#{@rbd_cmd} snap protect #{snapshot}\n"
209218

@@ -225,14 +234,19 @@ def backup_cmds(backup_dir, ds, live, format = nil)
225234

226235
old_snapshot = "one_backup_#{@vm_backup_config[:last_increment]}"
227236
snap_clup << rm_snaps_sh({ :type => :eq, :text => old_snapshot })
237+
238+
# On abort remove only the new snapshot, the previous one
239+
# is still the base for the next increment
240+
snap_abort << rm_snaps_sh({ :type => :eq, :text => "one_backup_#{incid}" })
228241
end
229242

230243
{
231-
:snapshot => snap_cmd,
232-
:export => expo_cmd,
233-
:snapshot_clup => snap_clup,
234-
:export_clup => expo_clup,
235-
:cleanup => snap_clup + expo_clup
244+
:snapshot => snap_cmd,
245+
:export => expo_cmd,
246+
:snapshot_clup => snap_clup,
247+
:export_clup => expo_clup,
248+
:snapshot_abort => snap_abort,
249+
:cleanup => snap_clup + expo_clup
236250
}
237251
end
238252

0 commit comments

Comments
 (0)