func (ta *TabletActor) updateReplicationGraphForPromotedSlave(tablet *topo.TabletInfo, actionNode *ActionNode) error { // Remove tablet from the replication graph if this is not already the master. if tablet.Parent.Uid != topo.NO_TABLET { err := ta.ts.DeleteReplicationPath(tablet.Keyspace, tablet.Shard, tablet.ReplicationPath()) if err != nil && err != topo.ErrNoNode { return err } } // Update tablet regardless - trend towards consistency. tablet.State = topo.STATE_READ_WRITE tablet.Type = topo.TYPE_MASTER tablet.Parent.Cell = "" tablet.Parent.Uid = topo.NO_TABLET err := topo.UpdateTablet(ta.ts, tablet) if err != nil { return err } // NOTE(msolomon) A serving graph update is required, but in order for the // shard to be consistent the master must be scrapped first. That is // externally coordinated by the wrangler reparent action. // Insert the new tablet location in the replication graph now that // we've updated the tablet. err = ta.ts.CreateReplicationPath(tablet.Keyspace, tablet.Shard, tablet.ReplicationPath()) if err != nil && err != topo.ErrNodeExists { return err } return nil }