func SlaveWasPromoted(ts topo.Server, mysqlDaemon mysqlctl.MysqlDaemon, tabletAlias topo.TabletAlias) error { // We first check we don't have a master any more. // If we do, it probably means we're not *the* master, and something // is really wrong. masterAddr, err := mysqlDaemon.GetMasterAddr() if err != mysqlctl.ErrNotSlave { return fmt.Errorf("new master is a slave: %v %v", masterAddr, err) } tablet, err := ts.GetTablet(tabletAlias) if err != nil { return err } return updateReplicationGraphForPromotedSlave(ts, mysqlDaemon, tablet) }
func SlaveWasRestarted(ts topo.Server, mysqlDaemon mysqlctl.MysqlDaemon, tabletAlias topo.TabletAlias, swrd *actionnode.SlaveWasRestartedArgs) error { tablet, err := ts.GetTablet(tabletAlias) if err != nil { return err } // check the reparent actually worked masterAddr, err := mysqlDaemon.GetMasterAddr() if err != nil { return err } if masterAddr != swrd.ExpectedMasterAddr && masterAddr != swrd.ExpectedMasterIpAddr { log.Errorf("SlaveWasRestarted found unexpected master %v for %v (was expecting %v or %v)", masterAddr, tabletAlias, swrd.ExpectedMasterAddr, swrd.ExpectedMasterIpAddr) // Disabled for now // if swrd.ContinueOnUnexpectedMaster { // log.Errorf("ContinueOnUnexpectedMaster is set, we keep going anyway") // } else if swrd.ScrapStragglers { return Scrap(ts, tablet.Alias, false) } else { return fmt.Errorf("Unexpected master %v for %v (was expecting %v or %v)", masterAddr, tabletAlias, swrd.ExpectedMasterAddr, swrd.ExpectedMasterIpAddr) } } // Once this action completes, update authoritive tablet node first. tablet.Parent = swrd.Parent if tablet.Type == topo.TYPE_MASTER { tablet.Type = topo.TYPE_SPARE tablet.State = topo.STATE_READ_ONLY } err = topo.UpdateTablet(ts, tablet) if err != nil { return err } // Update the new tablet location in the replication graph now that // we've updated the tablet. err = topo.CreateTabletReplicationData(ts, tablet.Tablet) if err != nil && err != topo.ErrNodeExists { return err } return nil }