From b21725bebbed3f46d913433b62bbfd982c7d40f7 Mon Sep 17 00:00:00 2001 From: Tim Vaillancourt Date: Mon, 8 Jul 2024 16:14:21 +0200 Subject: [PATCH] `slack-15.0`: reset semi-sync in `setReplicationSourceRepairReplication` Signed-off-by: Tim Vaillancourt --- .../vttablet/tabletmanager/rpc_replication.go | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/go/vt/vttablet/tabletmanager/rpc_replication.go b/go/vt/vttablet/tabletmanager/rpc_replication.go index 3ef6b543f3c..3aed26a5d16 100644 --- a/go/vt/vttablet/tabletmanager/rpc_replication.go +++ b/go/vt/vttablet/tabletmanager/rpc_replication.go @@ -31,6 +31,7 @@ import ( "vitess.io/vitess/go/vt/mysqlctl" "vitess.io/vitess/go/vt/servenv" "vitess.io/vitess/go/vt/topo/topoproto" + "vitess.io/vitess/go/vt/vtctl/reparentutil" "vitess.io/vitess/go/vt/vterrors" replicationdatapb "vitess.io/vitess/go/vt/proto/replicationdata" @@ -713,7 +714,29 @@ func (tm *TabletManager) setReplicationSourceRepairReplication(ctx context.Conte defer unlock(&err) - return tm.setReplicationSourceLocked(ctx, parentAlias, timeCreatedNS, waitPosition, forceStartReplication, SemiSyncActionNone) + currentPrimary, err := tm.TopoServer.GetTablet(ctx, parentAlias) + if err != nil { + return vterrors.Wrapf(err, "cannot read primary tablet %v", parentAlias) + } + + durabilityName, err := tm.TopoServer.GetKeyspaceDurability(ctx, tm.Tablet().Keyspace) + if err != nil { + return vterrors.Wrapf(err, "cannot read keyspace durability policy %v", tm.Tablet().Keyspace) + } + log.Infof("Getting a new durability policy for %v", durabilityName) + durability, err := reparentutil.GetDurabilityPolicy(durabilityName) + if err != nil { + return vterrors.Wrapf(err, "cannot get durability policy %v", durabilityName) + } + + // If using semi-sync, we need to enable it before connecting to primary. + // We should set the correct type, since it is used in replica semi-sync. + semiSyncAction, err := tm.convertBoolToSemiSyncAction(reparentutil.IsReplicaSemiSync(durability, currentPrimary.Tablet, tm.Tablet())) + if err != nil { + return err + } + + return tm.setReplicationSourceLocked(ctx, parentAlias, timeCreatedNS, waitPosition, forceStartReplication, semiSyncAction) } func (tm *TabletManager) setReplicationSourceSemiSyncNoAction(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, waitPosition string, forceStartReplication bool) error {