]> git.proxmox.com Git - pve-guest-common.git/commitdiff
Delete replication snapshots only if last_sync is not 0.
authorWolfgang Link <w.link@proxmox.com>
Wed, 9 May 2018 12:48:23 +0000 (14:48 +0200)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Wed, 9 May 2018 13:10:30 +0000 (15:10 +0200)
If last_sync is 0, the VM configuration has been stolen
(either manually or by HA restoration).
Under this condition, the replication snapshot should not be deleted.
This snapshot is used to restore replication state.
If the last_snap is greater than 0 and does not match the snap name
it must be a remnant of an earlier sync and should be deleted.

PVE/Replication.pm

index 4d1e071e30bc075c4cbb2e2f2d8e5740580cf86b..3ebf68224af90d74f705ecb31f3f4aea6fb650f9 100644 (file)
@@ -135,22 +135,26 @@ sub prepare {
                (defined($parent_snapname) && ($snap eq $parent_snapname))) {
                $last_snapshots->{$volid}->{$snap} = 1;
            } elsif ($snap =~ m/^\Q$prefix\E/) {
-               $logfunc->("delete stale replication snapshot '$snap' on $volid");
-
-               eval {
-                   PVE::Storage::volume_snapshot_delete($storecfg, $volid, $snap);
-                   $cleaned_replicated_volumes->{$volid} = 1;
-               };
-
-               # If deleting the snapshot fails, we can not be sure if it was due to an error or a timeout.
-               # The likelihood that the delete has worked out is high at a timeout.
-               # If it really fails, it will try to remove on the next run.
-               if (my $err = $@) {
-                   # warn is for syslog/journal.
-                   warn $err;
-
-                   # logfunc will written in replication log.
-                   $logfunc->("delete stale replication snapshot error: $err");
+               if ($last_sync != 0) {
+                   $logfunc->("delete stale replication snapshot '$snap' on $volid");
+                   eval {
+                       PVE::Storage::volume_snapshot_delete($storecfg, $volid, $snap);
+                       $cleaned_replicated_volumes->{$volid} = 1;
+                   };
+
+                   # If deleting the snapshot fails, we can not be sure if it was due to an error or a timeout.
+                   # The likelihood that the delete has worked out is high at a timeout.
+                   # If it really fails, it will try to remove on the next run.
+                   if (my $err = $@) {
+                       # warn is for syslog/journal.
+                       warn $err;
+
+                       # logfunc will written in replication log.
+                       $logfunc->("delete stale replication snapshot error: $err");
+                   }           
+               # Last_sync=0 and a replication snapshot only occur, if the VM was stolen
+               } else {
+                   $last_snapshots->{$volid}->{$snap} = 1;
                }
            }
        }
@@ -219,12 +223,11 @@ sub replicate {
            my %hash = map { $_ => 1 } @store_list;
 
            my $ssh_info = PVE::Cluster::get_ssh_info($jobcfg->{target});
-
            remote_prepare_local_job($ssh_info, $jobid, $vmid, [], [ keys %hash ], 1, undef, 1, $logfunc);
 
        }
        # remove all local replication snapshots (lastsync => 0)
-       prepare($storecfg, $sorted_volids, $jobid, 0, undef, $logfunc);
+       prepare($storecfg, $sorted_volids, $jobid, 1, undef, $logfunc);
 
        PVE::ReplicationConfig::delete_job($jobid); # update config
        $logfunc->("job removed");