Implement vm.storagecache and vm.storageformat

It has been requested to make these tunables available since different storage schemes
can benefit greatly from them
This commit is contained in:
Jarrod Johnson 2013-08-08 16:26:00 -04:00
parent 4139e20fb3
commit 65e1f6f484
3 changed files with 33 additions and 8 deletions

View File

@ -191,7 +191,7 @@ vmmaster => {
}
},
vm => {
cols => [qw(node mgr host migrationdest storage storagemodel cfgstore memory cpus nics nicmodel bootorder clockoffset virtflags master vncport textconsole powerstate beacon datacenter cluster guestostype othersettings vidmodel vidproto vidpassword comments disable)],
cols => [qw(node mgr host migrationdest storage storagemodel storagecache storageformat cfgstore memory cpus nics nicmodel bootorder clockoffset virtflags master vncport textconsole powerstate beacon datacenter cluster guestostype othersettings vidmodel vidproto vidpassword comments disable)],
keys => [qw(node)],
tablespace =>'XCATTBS32K',
table_desc => 'Virtualization parameters',
@ -230,6 +230,8 @@ vm => {
'vidproto' => "Request a specific protocol for remote video access be set up. For example, spice in KVM.",
'vidmodel' => "Model of video adapter to provide to guest. For example, qxl in KVM",
'vidpassword' => "Password to use instead of temporary random tokens for VNC and SPICE access",
'storagecache' => "Select caching scheme to employ. E.g. KVM understands 'none', 'writethrough' and 'writeback'",
'storageformat' => "Select disk format to use by default (e.g. raw versus qcow2)",
}
},
hypervisor => {
@ -2236,6 +2238,14 @@ my @nodeattrs = (
tabentry => 'vm.storagemodel',
access_tabentry => 'vm.node=attr:node',
},
{attr_name => 'vmstoragecache',
tabentry => 'vm.storagecache',
access_tabentry => 'vm.node=attr:node',
},
{attr_name => 'vmstorageformat',
tabentry => 'vm.storageformat',
access_tabentry => 'vm.node=attr:node',
},
{attr_name => 'vmcfgstore',
tabentry => 'vm.cfgstore',
access_tabentry => 'vm.node=attr:node',

View File

@ -26,7 +26,7 @@ sub grab_table_data{ #grab table data relevent to VM guest nodes
if ($vpdtab) {
$cfghash->{vpd} = $vpdtab->getNodesAttribs($noderange,['uuid']);
}
$cfghash->{vm} = $vmtab->getNodesAttribs($noderange,['node','host','migrationdest','cfgstore','storage','vidmodel','vidproto','vidpassword','storagemodel','memory','cpus','nics','nicmodel','bootorder','virtflags','datacenter','guestostype','othersettings','master']);
$cfghash->{vm} = $vmtab->getNodesAttribs($noderange,['node','host','migrationdest','cfgstore','storage','storagecache','storageformat','vidmodel','vidproto','vidpassword','storagemodel','memory','cpus','nics','nicmodel','bootorder','virtflags','datacenter','guestostype','othersettings','master']);
my $mactab = xCAT::Table->new("mac",-create=>1);
my $nrtab= xCAT::Table->new("noderes",-create=>1);
$cfghash->{mac} = $mactab->getAllNodeAttribs(['mac'],1);

View File

@ -488,6 +488,10 @@ sub build_diskstruct {
$cdhash->{target}->{dev}='hdc';
push @returns,$cdhash;
}
my $cachemethod = "none";
if ( $confdata->{vm}->{$node}->[0]->{storagecache}) {
$cachemethod = $confdata->{vm}->{$node}->[0]->{storagecache};
}
if (defined $confdata->{vm}->{$node}->[0]->{storage}) {
@ -530,8 +534,7 @@ sub build_diskstruct {
$tdiskhash->{device}='disk';
$tdiskhash->{driver}->{name}='qemu';
$tdiskhash->{driver}->{type}=$disks{$_}->{format};
$tdiskhash->{driver}->{cache}="none"; #in this scenario, making a brand new vm, there is not much the hypervisor cache can do for us that the
#guest cannot do for itself
$tdiskhash->{driver}->{cache}=$cachemethod;
$tdiskhash->{source}->{file}=$_;
$tdiskhash->{target}->{dev} = $disks{$_}->{device};
if ($disks{$_} =~ /^vd/) {
@ -1209,13 +1212,17 @@ sub createstorage {
#my $diskstruct = shift;
my $node = $cfginfo->{node};
my @flags = split /,/,$cfginfo->{virtflags};
my $format;
foreach (@flags) {
if (/^imageformat=(.*)\z/) {
$imgfmt=$1;
$format=$1;
} elsif (/^clonemethod=(.*)\z/) {
$clonemethod=$1;
}
}
if ($cfginfo->{storageformat}) {
$format = $cfginfo->{storageformat};
}
my $mountpath;
my $pathappend;
@ -1242,7 +1249,7 @@ sub createstorage {
if ($filename =~ /^nfs:/ or $filename =~ /^dir:/ or $filename =~ /^lvm:/) { #libvirt storage pool to be used for this
my @sizes = split /,/,$size;
foreach (@sizes) {
get_filepath_by_url(url=>$filename,dev=>$prefix.shift(@suffixes),create=>$_, force=>$force);
get_filepath_by_url(url=>$filename,dev=>$prefix.shift(@suffixes),create=>$_, force=>$force, format=>$format);
}
}else{
oldCreateStorage($filename, $mastername, $size, $cfginfo, $force);
@ -1653,6 +1660,15 @@ sub chvm {
$suffix=$1;
$format='raw';
}
if ($confdata->{vm}->{$node}->[0]->{storageformat}) {
$format = $confdata->{vm}->{$node}->[0]->{storageformat};
}
#when creating a new disk not cloned from anything, disable cache as copy on write content similarity is a lost cause...
my $cachemode = 'none';
#unless user knows better
if ($confdata->{vm}->{$node}->[0]->{storagecache}) {
$cachemode = $confdata->{vm}->{$node}->[0]->{storagecache};
}
my $bus;
if ($suffix =~ /^sd/) {
$bus='scsi';
@ -1661,8 +1677,7 @@ sub chvm {
} elsif ($suffix =~ /vd/) {
$bus='virtio';
}
#when creating a new disk not cloned from anything, disable cache as copy on write content similarity is a lost cause...
my $xml = "<disk type='file' device='disk'><driver name='qemu' type='$format' cache='none'/><source file='$_'/><target dev='$suffix' bus='$bus'/></disk>";
my $xml = "<disk type='file' device='disk'><driver name='qemu' type='$format' cache='$cachemode'/><source file='$_'/><target dev='$suffix' bus='$bus'/></disk>";
if ($currstate eq 'on') { #attempt live attach
eval {
$dom->attach_device($xml);