From 7800f1466fc03432b1f043d22f227f9d0ebc797b Mon Sep 17 00:00:00 2001 From: Daniel Clavijo Coca Date: Fri, 5 Nov 2021 11:56:53 -0600 Subject: [PATCH] B #5582: Add cache modes for qcow2 mapper on LXD/C drivers (#1535) --- .../remotes/lib/lxc/storage/mappers/qcow2.rb | 4 ++++ src/vmm_mad/remotes/lib/lxd/mapper/qcow2.rb | 21 ++++++++++++------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/vmm_mad/remotes/lib/lxc/storage/mappers/qcow2.rb b/src/vmm_mad/remotes/lib/lxc/storage/mappers/qcow2.rb index 9d0502613b..a226a4d863 100644 --- a/src/vmm_mad/remotes/lib/lxc/storage/mappers/qcow2.rb +++ b/src/vmm_mad/remotes/lib/lxc/storage/mappers/qcow2.rb @@ -25,6 +25,7 @@ require 'storageutils' class Qcow2Mapper QEMU_NBD_FORK_VERSION = '2.8.0' + CACHE_MODES = %w[none writethrough writeback directsync unsafe] COMMANDS = { :map => 'sudo -n qemu-nbd --fork -c', @@ -38,6 +39,9 @@ class Qcow2Mapper cmd = "#{COMMANDS[:map]} #{device} #{file}" + cmd << " --cache=#{disk['CACHE']}" if + CACHE_MODES.include?(disk['CACHE']) + rc = Command.execute_rc_log(cmd, false) return unless rc diff --git a/src/vmm_mad/remotes/lib/lxd/mapper/qcow2.rb b/src/vmm_mad/remotes/lib/lxd/mapper/qcow2.rb index 7c408ce867..9c9c59f09b 100644 --- a/src/vmm_mad/remotes/lib/lxd/mapper/qcow2.rb +++ b/src/vmm_mad/remotes/lib/lxd/mapper/qcow2.rb @@ -24,7 +24,8 @@ require 'mapper' class Qcow2Mapper < Mapper # Version --fork option was introduced in qemu-nbd command - QEMU_NBD_FORK_VERSION = "2.8.0" + QEMU_NBD_FORK_VERSION = '2.8.0' + CACHE_MODES = %w[none writethrough writeback directsync unsafe] def do_map(one_vm, disk, _directory) device = nbd_device @@ -34,9 +35,13 @@ class Qcow2Mapper < Mapper dsrc = one_vm.disk_source(disk) File.chmod(0o664, dsrc) if File.symlink?(one_vm.sysds_path) - map = "#{COMMANDS[:nbd]}" - map.concat(" --fork") if fork_supported - map.concat(" -c #{device} #{dsrc}") + map = (COMMANDS[:nbd]).to_s + + map << " --cache=#{disk['CACHE']}" if + CACHE_MODES.include?(disk['CACHE']) + + map << ' --fork' if fork_supported + map << " -c #{device} #{dsrc}" rc, _out, err = Command.execute(map, true) @@ -73,7 +78,7 @@ class Qcow2Mapper < Mapper def fork_supported tgt_ver = nbd_version - return false if tgt_ver == "0.0.0" + return false if tgt_ver == '0.0.0' Gem::Version.new(tgt_ver) >= Gem::Version.new(QEMU_NBD_FORK_VERSION) end @@ -83,11 +88,11 @@ class Qcow2Mapper < Mapper rc, out, _err = Command.execute(cmd, false) - return "0.0.0" unless rc.zero? + return '0.0.0' unless rc.zero? match_v = out.match(/qemu-nbd(?: version)? ((?:[0-9]+\.?)+)\s?\(?.*$/) - return "0.0.0" if match_v.nil? + return '0.0.0' if match_v.nil? match_v[1] end @@ -95,7 +100,7 @@ class Qcow2Mapper < Mapper # Detects Max number of block devices def nbds_max File.read('/sys/module/nbd/parameters/nbds_max').chomp.to_i - rescue => e + rescue StandardError => e OpenNebula.log_error("Cannot load kernel module parameter\n#{e}") 0 end