Skip to content

Commit 023924e

Browse files
josepselga1gramos
andauthored
F #6857: Add flattening support for Ceph incremental backups (#3699)
Signed-off-by: josepselga <[email protected]> Co-authored-by: Guillemo Ramos <[email protected]>
1 parent d79f2c7 commit 023924e

File tree

8 files changed

+395
-36
lines changed

8 files changed

+395
-36
lines changed

install.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,6 +1314,7 @@ TM_LIB_FILES="src/tm_mad/lib/kvm.rb \
13141314
src/tm_mad/lib/shell.rb \
13151315
src/tm_mad/lib/tm_action.rb \
13161316
src/tm_mad/lib/backup_qcow2.rb \
1317+
src/tm_mad/lib/backup_rbd.rb \
13171318
src/tm_mad/lib/datastore.rb \
13181319
src/tm_mad/lib/tm_cache.rb \
13191320
src/tm_mad/lib/backup.rb"

src/datastore_mad/remotes/restic/backup

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,13 @@ script = <<~EOS
159159
set -e -o pipefail; shopt -qs failglob
160160
161161
#{rds.resticenv_sh}
162+
BKNAME=$(ls #{vm_dir}/disk.* | head -n 1)
162163
163164
RC=`#{ds.cmd_confinement(rcmd, vm_dir, ['SSH_AUTH_SOCK', 'RESTIC_PASSWORD', 'GOMAXPROCS'])}`
164165
165166
INFO=`echo "$RC" | jq -r '.snapshot_id + " " + (.total_bytes_processed|tostring) | select ( . != " null" )'`
166167
167-
echo $INFO
168+
echo "$INFO $BKNAME"
168169
EOS
169170

170171
rc = TransferManager::Action.ssh 'backup',
@@ -181,7 +182,7 @@ end
181182

182183
parts = rc.stdout.lines.last.split
183184

184-
if parts.length != 2
185+
if parts.length != 3
185186
STDERR.puts "Wrong format for backup action: #{rc.stdout}"
186187
exit(-1)
187188
end
@@ -191,14 +192,9 @@ end
191192
id = parts[0]
192193
short_id = id[0..7] # first 8 chars only
193194

194-
vm = REXML::Document.new(xml).root.elements['VM']
195-
backup_format =
196-
if vm.elements['TEMPLATE/TM_MAD_SYSTEM'].text == 'ceph' &&
197-
vm.elements['BACKUPS/BACKUP_CONFIG/MODE']&.text == 'INCREMENT'
198-
'rbd'
199-
else
200-
'raw'
201-
end
195+
disk_filepath = parts[2]
196+
extension = File.extname(disk_filepath).delete_prefix('.')
197+
backup_format = ['rbd2', 'rbdiff'].include?(extension) ? 'rbd' : 'raw'
202198

203199
STDOUT.puts "#{short_id} #{parts[1].to_i / (1024 * 1024)} #{backup_format}"
204200
exit(0)

src/datastore_mad/remotes/rsync/backup

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -159,10 +159,9 @@ script = <<~EOS
159159
set -ex -o pipefail
160160
161161
BKSIZE=`du -sm #{vm_dir}`
162-
162+
BKNAME=$(ls #{vm_dir}/disk.* | head -n 1)
163163
#{ds.cmd_confinement(cmd, vm_dir, ['SSH_AUTH_SOCK'])} > /dev/null
164-
165-
echo $BKSIZE
164+
echo "$BKSIZE $BKNAME"
166165
EOS
167166

168167
rc = TransferManager::Action.ssh 'backup',
@@ -177,14 +176,11 @@ if rc.code != 0 || rc.stdout.empty?
177176
exit(-1)
178177
end
179178

180-
vm = REXML::Document.new(xml).root.elements['VM']
181-
backup_format =
182-
if vm.elements['TEMPLATE/TM_MAD_SYSTEM'].text == 'ceph' &&
183-
vm.elements['BACKUPS/BACKUP_CONFIG/MODE']&.text == 'INCREMENT'
184-
'rbd'
185-
else
186-
'raw'
187-
end
179+
stdout_parts = rc.stdout.split(' ')
180+
181+
disk_filepath = stdout_parts[2]
182+
extension = File.extname(disk_filepath).delete_prefix('.')
183+
backup_format = ['rbd2', 'rbdiff'].include?(extension) ? 'rbd' : 'raw'
188184

189185
STDOUT.puts "#{backup_id} #{rc.stdout.lines.last.split[0]} #{backup_format}"
190186
exit(0)

src/tm_mad/lib/backup.rb

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
#--------------------------------------------------------------------------- #
1818

1919
require 'CommandManager'
20+
require 'rexml/document'
21+
2022
require_relative 'kvm'
2123
require_relative 'shell'
2224

@@ -42,14 +44,32 @@ def backup_disks_sh(options = {})
4244

4345
snap_cmd = ''
4446
expo_cmd = ''
47+
4548
snap_clup = ''
4649
expo_clup = ''
4750

51+
xml_vm = REXML::Document.new(@xml).root
52+
53+
bk_img_id_elem = xml_vm.elements['BACKUPS/BACKUP_IDS/ID']
54+
bk_img_id = bk_img_id_elem&.text&.strip
55+
56+
if bk_img_id.nil? || bk_img_id.empty?
57+
disk_format = 'qcow2'
58+
else
59+
client = OpenNebula::Client.new
60+
bk_img = OpenNebula::Image.new_with_id(bk_img_id, client)
61+
62+
bk_img.info
63+
64+
disk_format = bk_img['FORMAT']&.strip
65+
end
66+
4867
@disks.compact.each do |d|
4968
did = d.id
5069
next unless disks.include? did.to_s
5170

52-
cmds = d.backup_cmds(backup_dir, ds, live)
71+
# Pass the format for this disk (or nil if not set)
72+
cmds = d.backup_cmds(backup_dir, ds, live, disk_format)
5373
return nil unless cmds
5474

5575
snap_cmd << cmds[:snapshot].to_s

0 commit comments

Comments
 (0)