]> git.proxmox.com Git - qemu-server.git/commitdiff
Fix #1999: cli: listsnapshot: handle multiple roots and mark orphaned as root
authorRhonda D'Vine <rhonda@proxmox.com>
Wed, 5 Jun 2019 13:30:48 +0000 (15:30 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 5 Jun 2019 17:22:30 +0000 (19:22 +0200)
This commit addresses the following things:

* There can be multiple independent snapshot tree roots, display them
  all
* If a snapshot defines a parent that doesn't exist, it is now
  considered a snapshot root

There is a potential issue (which was also before and also affects the
GUI): circular snapshot trees.  That plays into the second mentioned
issue above.  If you manage to have a snapshot that defines a
non-existing root in the config, and then create a snapshot with that
exact name as a child of that snapshot, it would create a circular
dependency.  This would have to get addressed in the GUI too.

Signed-off-by: Rhonda D'Vine <rhonda@proxmox.com>
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
PVE/CLI/qm.pm

index 87b97ce08da9e597e1ce37f26d5c984cc4a09d0a..b5e838e1dfa9c78e26cfed2800d0cb6b4db762d2 100755 (executable)
@@ -926,12 +926,13 @@ our $cmddef = {
 
                        my $snapshots = { map { $_->{name} => $_ } @$res };
 
-                       my $root;
+                       my @roots;
                        foreach my $e (@$res) {
-                           if (my $parent = $e->{parent}) {
+                           my $parent;
+                           if (($parent = $e->{parent}) && defined $snapshots->{$parent}) {
                                push @{$snapshots->{$parent}->{children}}, $e->{name};
                            } else {
-                               $root = $e->{name};
+                               push @roots, $e->{name};
                            }
                        }
 
@@ -967,7 +968,9 @@ our $cmddef = {
                            }
                        };
 
-                       $snapshottree->('`->', $root, $snapshots);
+                       foreach my $root (sort $snaptimesort @roots) {
+                           $snapshottree->('`->', $root, $snapshots);
+                       }
                    }],
 
     rollback => [ "PVE::API2::Qemu", 'rollback', ['vmid', 'snapname'], { node => $nodename } , $upid_exit ],