// StopSlaveMinimum will stop the slave after it reaches at least the // provided position. Works both when Vitess manages // replication or not (using hook if not). func (agent *ActionAgent) StopSlaveMinimum(ctx context.Context, position myproto.ReplicationPosition, waitTime time.Duration) (myproto.ReplicationPosition, error) { if err := agent.MysqlDaemon.WaitMasterPos(position, waitTime); err != nil { return myproto.ReplicationPosition{}, err } if err := mysqlctl.StopSlave(agent.MysqlDaemon, agent.hookExtraEnv()); err != nil { return myproto.ReplicationPosition{}, err } return agent.MysqlDaemon.MasterPosition() }
// StopSlaveMinimum will stop the slave after it reaches at least the // provided position. Works both when Vitess manages // replication or not (using hook if not). func (agent *ActionAgent) StopSlaveMinimum(ctx context.Context, position string, waitTime time.Duration) (string, error) { pos, err := replication.DecodePosition(position) if err != nil { return "", err } if err := agent.MysqlDaemon.WaitMasterPos(pos, waitTime); err != nil { return "", err } if err := mysqlctl.StopSlave(agent.MysqlDaemon, agent.hookExtraEnv()); err != nil { return "", err } pos, err = agent.MysqlDaemon.MasterPosition() if err != nil { return "", err } return replication.EncodePosition(pos), nil }
// StopSlave will stop the replication. Works both when Vitess manages // replication or not (using hook if not). // Should be called under RPCWrapLock. func (agent *ActionAgent) StopSlave(ctx context.Context) error { // Remember that we were told to stop, so we don't try to // restart ourselves (in replication_reporter). agent.setSlaveStopped(true) // Also tell Orchestrator we're stopped on purpose for some Vitess task. // Do this in the background, as it's best-effort. go func() { if agent.orc == nil { return } if err := agent.orc.BeginMaintenance(agent.Tablet(), "vttablet has been told to StopSlave"); err != nil { log.Warningf("Orchestrator BeginMaintenance failed: %v", err) } }() return mysqlctl.StopSlave(agent.MysqlDaemon, agent.hookExtraEnv()) }
// StopReplicationAndGetStatus stops MySQL replication, and returns the // current status func (agent *ActionAgent) StopReplicationAndGetStatus(ctx context.Context) (*replicationdatapb.Status, error) { // get the status before we stop replication rs, err := agent.MysqlDaemon.SlaveStatus() if err != nil { return nil, fmt.Errorf("before status failed: %v", err) } if !rs.SlaveIORunning && !rs.SlaveSQLRunning { // no replication is running, just return what we got return replication.StatusToProto(rs), nil } if err := mysqlctl.StopSlave(agent.MysqlDaemon, agent.hookExtraEnv()); err != nil { return nil, fmt.Errorf("stop slave failed: %v", err) } // now patch in the current position rs.Position, err = agent.MysqlDaemon.MasterPosition() if err != nil { return nil, fmt.Errorf("after position failed: %v", err) } return replication.StatusToProto(rs), nil }
// StopSlave will stop the replication. Works both when Vitess manages // replication or not (using hook if not). // Should be called under RPCWrapLock. func (agent *ActionAgent) StopSlave(ctx context.Context) error { return mysqlctl.StopSlave(agent.MysqlDaemon, agent.hookExtraEnv()) }