]> git.proxmox.com Git - pve-guest-common.git/commitdiff
ReplicationState: purge state from non local vms
authorDominik Csapak <d.csapak@proxmox.com>
Fri, 3 Jun 2022 07:16:29 +0000 (09:16 +0200)
committerThomas Lamprecht <t.lamprecht@proxmox.com>
Wed, 8 Jun 2022 06:48:04 +0000 (08:48 +0200)
when running replication, we don't want to keep replication states for
non-local vms. Normally this would not be a problem, since on migration,
we transfer the states anyway, but when the ha-manager steals a vm, it
cannot do that. In that case, having an old state lying around is
harmful, since the code does not expect the state to be out-of-sync
with the actual snapshots on disk.

One such problem is the following:

Replicate vm 100 from node A to node B and C, and activate HA. When node
A dies, it will be relocated to e.g. node B and start replicate from
there. If node B now had an old state lying around for it's sync to node
C, it might delete the common base snapshots of B and C and cannot sync
again.

Deleting the state for all non local guests fixes that issue, since it
always starts fresh, and the potentially existing old state cannot be
valid anyway since we just relocated the vm here (from a dead node).

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
Reviewed-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
Reviewed-by: Fabian Ebner <f.ebner@proxmox.com>
src/PVE/ReplicationState.pm

index 0a5e410db66aeff06abc9f2affa3f72f0f7c2e73..8eebb426414aceac68ce7a0dbc530df2ccd461cb 100644 (file)
@@ -215,7 +215,7 @@ sub purge_old_states {
        my $tid = $plugin->get_unique_target_id($jobcfg);
        my $vmid = $jobcfg->{guest};
        $used_tids->{$vmid}->{$tid} = 1
-           if defined($vms->{ids}->{$vmid}); # && $vms->{ids}->{$vmid}->{node} eq $local_node;
+           if defined($vms->{ids}->{$vmid}) && $vms->{ids}->{$vmid}->{node} eq $local_node;
     }
 
     my $purge_state = sub {