$class->lock_config($vmid, sub {
my $conf = $class->load_config($vmid);
if (!$conf->{lock}) {
- die "no lock found trying to remove lock '$lock'\n";
+ my $lockstring = defined($lock) ? "'$lock' " : "any";
+ die "no lock found trying to remove $lockstring lock\n";
} elsif (defined($lock) && $conf->{lock} ne $lock) {
- die "found lock '$conf->{lock}' trying to remove lock '$lock'\n";
+ die "found lock '$conf->{lock}' trying to remove '$lock' lock\n";
}
delete $conf->{lock};
$class->write_config($vmid, $conf);
die "abstract method - implement me\n";
}
+# Code run before and after creating all the volume snapshots
+# base: noop
+sub __snapshot_create_vol_snapshots_hook {
+ my ($class, $vmid, $snap, $running, $hook) = @_;
+
+ return;
+}
+
# Create the volume snapshots for the VM/CT.
sub __snapshot_create_vol_snapshot {
my ($class, $vmid, $vs, $volume, $snapname) = @_;
die "abstract method - implement me\n";
}
+# Get list of volume IDs which are referenced in $conf, but not in $snap.
+sub __snapshot_rollback_get_unused {
+ my ($class, $conf, $snap) = @_;
+
+ die "abstract method - implement me\n";
+}
+
# Iterate over all configured volumes, calling $func for each key/value pair.
sub __snapshot_foreach_volume {
my ($class, $conf, $func) = @_;
$class->__snapshot_freeze($vmid, 0);
}
+ $class->__snapshot_create_vol_snapshots_hook($vmid, $snap, $running, "before");
+
$class->__snapshot_foreach_volume($snap, sub {
my ($vs, $volume) = @_;
my $err = $@;
if ($running) {
+ $class->__snapshot_create_vol_snapshots_hook($vmid, $snap, $running, "after");
if ($freezefs) {
$class->__snapshot_freeze($vmid, 1);
}
+ $class->__snapshot_create_vol_snapshots_hook($vmid, $snap, $running, "after-unfreeze");
}
if ($err) {
return if $snapname eq 'vzdump' && $vs ne 'rootfs' && !$volume->{backup};
if (!$drivehash || $drivehash->{$vs}) {
- eval { $class->__snapshot_delete_vol_snapshot($vmid, $vs, $volume, $snapname); };
+ eval { $class->__snapshot_delete_vol_snapshot($vmid, $vs, $volume, $snapname, $unused); };
if (my $err = $@) {
die $err if !$force;
warn $err;
# save changes (remove mp from snapshot)
$class->lock_config($vmid, $updatefn, $vs) if !$force;
- push @$unused, $volume->{volume};
});
# now cleanup config
my $forcemachine;
if (!$prepare) {
+ my $unused = $class->__snapshot_rollback_get_unused($conf, $snap);
+
+ foreach my $volid (@$unused) {
+ $class->add_unused_volume($conf, $volid);
+ }
+
my $has_machine_config = defined($conf->{machine});
# copy snapshot config to current config