[pve-devel] [PATCH container] Remove an unused volume from the config if it is pending to be re-added

Fabian Grünbichler f.gruenbichler at proxmox.com
Wed Nov 27 10:23:48 CET 2019


On November 27, 2019 9:39 am, Fabian Ebner wrote:
> On 11/26/19 4:18 PM, Oguz Bektas wrote:
>> hi,
>> 
>> found an issue here:
>> 1 - create a new mp on running container
>> 2 - mp gets added as pending, but disk is not created yet
>> 3 - revert the pending mp
>> 4 - this adds an unused disk, which doesn't exist and can't be removed via GUI
>> 
>> when i try to revert a new mp, 'guests:1'
>> 
>> this is what $mp is:
>> 
>> $VAR1 = {
>> 'type' => 'volume',
>> 'mp' => 'abc',
>> 'volume' => 'guests:1'
>> };
>> 
>> so it passes your checks since it's defined and type is 'volume'
> 
> Thank you for testing. Doing the same thing for a running VM (adding an 
> IDE disk and reverting the pending change) also produces an unused disk 
> that wasn't there before, but it already got allocated, so one can 
> remove it without problems.
> 
> Should we allocate mount points straight away as well?
> Or would it be better to simply mark an unused volume (cross it out with 
> a red line in the GUI) when it is pending to be re-added?

we discussed this when Oguz implemented pending changes for containers, 
and settled on the following approach:

1.) add to pending, without side-effects
2.a) if running, attempt to hot-plug pending changes
2.b) if not running, apply pending changes

vdisk allocation only happens in step 2, not 1. we actually would like 
to make the qemu/VM code path more similar to this, not the other way 
round - it is better to keep config-only and actual changes distinct, as 
it simplifies error-handling and reasoning about the code.

>> you could add another check to see if the disk is new, but then it might break the hotplug mount
>> 
> 
> That should work as well. Please tell me if I'm wrong, but isn't a 
> hotplug mount done straight away and hence doesn't land in the pending 
> section of the config? And so it can't be reverted either?

see above ;)

>> On Tue, Nov 26, 2019 at 12:51:38PM +0100, Fabian Ebner wrote:
>>> This makes the behavior more similar to what we do for VM configs.
>>> If we have a pending change re-adding an unused volume as a mount point, then
>>> the unused volume will not show up anymore. And if we revert such a change, the
>>> volume will re-appear as an unused volume.
>>> Like this a user with a running container won't be able to re-add an unused
>>> volume multiple times via the web GUI.
>>>
>>> Signed-off-by: Fabian Ebner <f.ebner at proxmox.com>
>>> ---
>>>   src/PVE/LXC/Config.pm | 11 +++++++++++
>>>   1 file changed, 11 insertions(+)
>>>
>>> diff --git a/src/PVE/LXC/Config.pm b/src/PVE/LXC/Config.pm
>>> index ffc5911..c2ae166 100644
>>> --- a/src/PVE/LXC/Config.pm
>>> +++ b/src/PVE/LXC/Config.pm
>>> @@ -839,12 +839,14 @@ sub write_pct_config {
>>>       delete $conf->{snapstate}; # just to be sure
>>>   
>>>       my $volidlist = PVE::LXC::Config->get_vm_volumes($conf);
>>> +    push @$volidlist, @{PVE::LXC::Config->get_vm_volumes($conf->{pending})};
>>>       my $used_volids = {};
>>>       foreach my $vid (@$volidlist) {
>>>           $used_volids->{$vid} = 1;
>>>       }
>>>   
>>>       # remove 'unusedX' settings if the volume is still used
>>> +    # or if it's pending to be re-added
>>>       foreach my $key (keys %$conf) {
>>>           my $value = $conf->{$key};
>>>           if ($key =~ m/^unused/ && $used_volids->{$value}) {
>>> @@ -904,6 +906,15 @@ sub update_pct_config {
>>>       my $storage_cfg = PVE::Storage::config();
>>>   
>>>       foreach my $opt (@$revert) {
>>> +	# unused volume that was pending to become a mount point should show up again
>>> +	if ($opt =~ m/^mp(\d+)$/) {
>>> +	    my $mp = eval { $class->parse_ct_mountpoint($conf->{pending}->{$opt}); };
>>> +	    if (defined($mp) && $mp->{type} eq 'volume') {
>>> +		$class->add_unused_volume($conf, $mp->{volume})
>>> +		    if !$class->is_volume_in_use($conf, $conf->{pending}->{$opt}, 1, 0);
>>> +	    }
>>> +	}
>>> +
>>>   	delete $conf->{pending}->{$opt};
>>>   	$class->remove_from_pending_delete($conf, $opt); # also remove from deletion queue
>>>       }
>>> -- 
>>> 2.20.1
>>>
>>>
>>> _______________________________________________
>>> pve-devel mailing list
>>> pve-devel at pve.proxmox.com
>>> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>>>
>> 
>> _______________________________________________
>> pve-devel mailing list
>> pve-devel at pve.proxmox.com
>> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
>> 
> 
> _______________________________________________
> pve-devel mailing list
> pve-devel at pve.proxmox.com
> https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
> 
> 




More information about the pve-devel mailing list