wrangler

package
v0.0.0-...-2166858 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 28, 2016 License: BSD-3-Clause Imports: 31 Imported by: 0

Documentation

Overview

wrangler contains the Wrangler object to manage complex topology actions.

Index

Constants

View Source
const ChangeSlaveTypeActionName = "ChangeSlaveTypeAction"
View Source
const (
	SLAVE_STATUS_DEADLINE = 10e9
)
View Source
const StartBlpActionName = "StartBlpAction"
View Source
const StartSlaveActionName = "StartSlaveAction"
View Source
const TabletTagActionName = "TabletTagAction"

Variables

View Source
var (
	// DefaultActionTimeout is a good default for interactive
	// remote actions. We usually take a lock then do an action,
	// so basing this to be greater than DefaultLockTimeout is good.
	DefaultActionTimeout = actionnode.DefaultLockTimeout * 4
)

Functions

func RecordChangeSlaveTypeAction

func RecordChangeSlaveTypeAction(cleaner *Cleaner, tabletAlias topo.TabletAlias, tabletType topo.TabletType)

RecordChangeSlaveTypeAction records a new ChangeSlaveTypeAction into the specified Cleaner

func RecordStartBlpAction

func RecordStartBlpAction(cleaner *Cleaner, tabletInfo *topo.TabletInfo, waitTime time.Duration)

RecordStartBlpAction records a new StartBlpAction into the specified Cleaner

func RecordStartSlaveAction

func RecordStartSlaveAction(cleaner *Cleaner, tabletInfo *topo.TabletInfo, waitTime time.Duration)

RecordStartSlaveAction records a new StartSlaveAction into the specified Cleaner

func RecordTabletTagAction

func RecordTabletTagAction(cleaner *Cleaner, tabletAlias topo.TabletAlias, name, value string)

RecordTabletTagAction records a new TabletTagAction into the specified Cleaner

func SignalInterrupt

func SignalInterrupt()

SignalInterrupt needs to be called when a signal interrupts the current process.

func WriteAddr

func WriteAddr(zconn zk.Conn, zkPath string, addr *zkns.ZknsAddr) error

func WriteAddrs

func WriteAddrs(zconn zk.Conn, zkPath string, addrs *LegacyZknsAddrs) error

Types

type ChangeSlaveTypeAction

type ChangeSlaveTypeAction struct {
	TabletAlias topo.TabletAlias
	TabletType  topo.TabletType
}

ChangeSlaveTypeAction will change a server type to another type

func FindChangeSlaveTypeActionByTarget

func FindChangeSlaveTypeActionByTarget(cleaner *Cleaner, tabletAlias topo.TabletAlias) (*ChangeSlaveTypeAction, error)

FindChangeSlaveTypeActionByTarget finds the first action for the target

func (ChangeSlaveTypeAction) CleanUp

func (csta ChangeSlaveTypeAction) CleanUp(wr *Wrangler) error

CleanUp is part of CleanerAction interface.

type Cleaner

type Cleaner struct {
	// contains filtered or unexported fields
}

Cleaner remembers a list of cleanup steps to perform. Just record action cleanup steps, and execute them at the end in reverse order, with various guarantees.

func (*Cleaner) CleanUp

func (cleaner *Cleaner) CleanUp(wr *Wrangler) error

CleanUp will run the recorded actions. If an action on a target fails, it will not run the next action on the same target. We return the aggregate errors for all cleanups. TODO(alainjobart) Actions should run concurrently on a per target basis. They are then serialized on each target.

func (*Cleaner) GetActionByName

func (cleaner *Cleaner) GetActionByName(name, target string) (CleanerAction, error)

GetActionByName returns the first action in the list with the given name and target

func (*Cleaner) Record

func (cleaner *Cleaner) Record(name, target string, action CleanerAction)

Record will add a cleaning action to the list

func (*Cleaner) RemoveActionByName

func (cleaner *Cleaner) RemoveActionByName(name, target string) error

RemoveActionByName removes an action from the cleaner list

type CleanerAction

type CleanerAction interface {
	CleanUp(wr *Wrangler) error
}

CleanerAction is the interface that clean-up actions need to implement

type LegacyZknsAddrs

type LegacyZknsAddrs struct {
	Endpoints []string `json:"endpoints"`
}

type StartBlpAction

type StartBlpAction struct {
	TabletInfo *topo.TabletInfo
	WaitTime   time.Duration
}

StartBlpAction will restart binlog replication on a server

func (StartBlpAction) CleanUp

func (sba StartBlpAction) CleanUp(wr *Wrangler) error

CleanUp is part of CleanerAction interface.

type StartSlaveAction

type StartSlaveAction struct {
	TabletInfo *topo.TabletInfo
	WaitTime   time.Duration
}

StartSlaveAction will restart binlog replication on a server

func (StartSlaveAction) CleanUp

func (sba StartSlaveAction) CleanUp(wr *Wrangler) error

CleanUp is part of CleanerAction interface.

type TabletStatus

type TabletStatus struct {
	// contains filtered or unexported fields
}

local structure used to keep track of what we're doing

type TabletTagAction

type TabletTagAction struct {
	TabletAlias topo.TabletAlias
	Name        string
	Value       string
}

TabletTagAction will add / remove a tag to a tablet. If Value is empty, will remove the tag.

func (TabletTagAction) CleanUp

func (tta TabletTagAction) CleanUp(wr *Wrangler) error

CleanUp is part of CleanerAction interface.

type Wrangler

type Wrangler struct {
	// contains filtered or unexported fields
}

Wrangler manages complex actions on the topology, like reparents, snapshots, restores, ... It is not a thread safe structure. Two go routines cannot usually call the same Wrangler object methods at the same time (they probably would not have the same logger, and definitely not the same context).

func New

func New(logger logutil.Logger, ts topo.Server, actionTimeout, lockTimeout time.Duration) *Wrangler

New creates a new Wrangler object.

actionTimeout: how long should we wait for an action to complete?

  • if using wrangler for just one action, this is set properly upon wrangler creation.
  • if re-using wrangler multiple times, call ResetActionTimeout before every action. Do not use this too much, just for corner cases. It is just much easier to create a new Wrangler object per action.

lockTimeout: how long should we wait for the initial lock to start a complex action? This is distinct from actionTimeout because most of the time, we want to immediately know that our action will fail. However, automated action will need some time to arbitrate the locks.

func (*Wrangler) ActionTimeout

func (wr *Wrangler) ActionTimeout() time.Duration

ActionTimeout returns the timeout to use so the action finishes before the deadline.

func (*Wrangler) ApplySchema

func (wr *Wrangler) ApplySchema(tabletAlias topo.TabletAlias, sc *myproto.SchemaChange) (*myproto.SchemaChangeResult, error)

ApplySchema will apply a schema change on the remote tablet.

func (*Wrangler) ApplySchemaKeyspace

func (wr *Wrangler) ApplySchemaKeyspace(keyspace string, change string, simple, force bool) (*myproto.SchemaChangeResult, error)

apply a schema change to an entire keyspace. take a keyspace lock to do this. first we will validate the Preflight works the same on all shard masters and fail if not (unless force is specified) if simple, we just do it on all masters. if complex, we do the shell game in parallel on all shards

func (*Wrangler) ApplySchemaShard

func (wr *Wrangler) ApplySchemaShard(keyspace, shard, change string, newParentTabletAlias topo.TabletAlias, simple, force bool) (*myproto.SchemaChangeResult, error)

Note for 'complex' mode (the 'simple' mode is easy enough that we don't need to handle recovery that much): this method is able to recover if interrupted in the middle, because it knows which server has the schema change already applied, and will just pass through them very quickly.

func (*Wrangler) ChangeType

func (wr *Wrangler) ChangeType(tabletAlias topo.TabletAlias, tabletType topo.TabletType, force bool) error

Change the type of tablet and recompute all necessary derived paths in the serving graph. If force is true, it will bypass the RPC action system and make the data change directly, and not run the remote hooks.

Note we don't update the master record in the Shard here, as we can't ChangeType from and out of master anyway.

func (*Wrangler) ChangeTypeNoRebuild

func (wr *Wrangler) ChangeTypeNoRebuild(tabletAlias topo.TabletAlias, tabletType topo.TabletType, force bool) (rebuildRequired bool, cell, keyspace, shard string, err error)

ChangeTypeNoRebuild changes a tablet's type, and returns whether there's a shard that should be rebuilt, along with its cell, keyspace, and shard. If force is true, it will bypass the RPC action system and make the data change directly, and not run the remote hooks.

Note we don't update the master record in the Shard here, as we can't ChangeType from and out of master anyway.

func (*Wrangler) Clone

func (wr *Wrangler) Clone(srcTabletAlias topo.TabletAlias, dstTabletAliases []topo.TabletAlias, forceMasterSnapshot bool, snapshotConcurrency, fetchConcurrency, fetchRetryCount int, serverMode bool) error

Clone will do all the necessary actions to copy all the data from a source to a set of destinations.

func (*Wrangler) Context

func (wr *Wrangler) Context() context.Context

Context returns the context associated with this Wrangler. It is invalidated if ResetActionTimeout is caled on the Wrangler.

func (*Wrangler) CopySchemaShard

func (wr *Wrangler) CopySchemaShard(srcTabletAlias topo.TabletAlias, tables, excludeTables []string, includeViews bool, keyspace, shard string) error

Copy the schema from a source tablet to the specified shard. The schema is applied directly on the master of the destination shard, and is propogated to the replicas through binlogs.

func (*Wrangler) DeleteShard

func (wr *Wrangler) DeleteShard(keyspace, shard string) error

DeleteShard will do all the necessary changes in the topology server to entirely remove a shard. It can only work if there are no tablets in that shard.

func (*Wrangler) DeleteTablet

func (wr *Wrangler) DeleteTablet(tabletAlias topo.TabletAlias) error

DeleteTablet will get the tablet record, and if it's scrapped, will delete the record from the topology.

func (*Wrangler) ExecuteFetch

func (wr *Wrangler) ExecuteFetch(tabletAlias topo.TabletAlias, query string, maxRows int, wantFields, disableBinlogs bool) (*mproto.QueryResult, error)

ExecuteFetch will get data from a remote tablet

func (*Wrangler) ExecuteHook

func (wr *Wrangler) ExecuteHook(tabletAlias topo.TabletAlias, hook *hk.Hook) (hookResult *hk.HookResult, err error)

func (*Wrangler) ExecuteOptionalTabletInfoHook

func (wr *Wrangler) ExecuteOptionalTabletInfoHook(ti *topo.TabletInfo, hook *hk.Hook) (err error)

Execute a hook and returns an error only if the hook failed, not if the hook doesn't exist.

func (*Wrangler) ExecuteTabletInfoHook

func (wr *Wrangler) ExecuteTabletInfoHook(ti *topo.TabletInfo, hook *hk.Hook) (hookResult *hk.HookResult, err error)

func (*Wrangler) ExportZkns

func (wr *Wrangler) ExportZkns(cell string) error

Export addresses from the VT serving graph to a legacy zkns server. Note these functions only work with a zktopo.

func (*Wrangler) ExportZknsForKeyspace

func (wr *Wrangler) ExportZknsForKeyspace(keyspace string) error

Export addresses from the VT serving graph to a legacy zkns server.

func (*Wrangler) GetPermissions

func (wr *Wrangler) GetPermissions(tabletAlias topo.TabletAlias) (*myproto.Permissions, error)

func (*Wrangler) GetSchema

func (wr *Wrangler) GetSchema(tabletAlias topo.TabletAlias, tables, excludeTables []string, includeViews bool) (*myproto.SchemaDefinition, error)

GetSchema uses an RPC to get the schema from a remote tablet

func (*Wrangler) GetVersion

func (wr *Wrangler) GetVersion(tabletAlias topo.TabletAlias) (string, error)

func (*Wrangler) InitTablet

func (wr *Wrangler) InitTablet(tablet *topo.Tablet, force, createShardAndKeyspace, update bool) error

InitTablet creates or updates a tablet. If no parent is specified in the tablet, and the tablet has a slave type, we will find the appropriate parent. If createShardAndKeyspace is true and the parent keyspace or shard don't exist, they will be created. If update is true, and a tablet with the same ID exists, update it. If Force is true, and a tablet with the same ID already exists, it will be scrapped and deleted, and then recreated.

func (*Wrangler) Logger

func (wr *Wrangler) Logger() logutil.Logger

Logger returns the logger associated with this wrangler.

func (*Wrangler) MigrateServedFrom

func (wr *Wrangler) MigrateServedFrom(keyspace, shard string, servedType topo.TabletType, cells []string, reverse bool) error

MigrateServedFrom is used during vertical splits to migrate a served type from a keyspace to another.

func (*Wrangler) MigrateServedTypes

func (wr *Wrangler) MigrateServedTypes(keyspace, shard string, cells []string, servedType topo.TabletType, reverse, skipReFreshState bool) error

MigrateServedTypes is used during horizontal splits to migrate a served type from a list of shards to another.

func (*Wrangler) PreflightSchema

func (wr *Wrangler) PreflightSchema(tabletAlias topo.TabletAlias, change string) (*myproto.SchemaChangeResult, error)

PreflightSchema will try a schema change on the remote tablet.

func (*Wrangler) RebuildKeyspaceGraph

func (wr *Wrangler) RebuildKeyspaceGraph(keyspace string, cells []string) error

Rebuild the serving graph data while locking out other changes. If some shards were recently read / updated, pass them in the cache so we don't read them again (and possible get stale replicated data)

func (*Wrangler) RebuildReplicationGraph

func (wr *Wrangler) RebuildReplicationGraph(cells []string, keyspaces []string) error

This is a quick and dirty tool to resurrect the TopologyServer data from the canonical data stored in the tablet nodes.

cells: local vt cells to scan for all tablets keyspaces: list of keyspaces to rebuild

func (*Wrangler) RebuildShardGraph

func (wr *Wrangler) RebuildShardGraph(keyspace, shard string, cells []string) (*topo.ShardInfo, error)

Rebuild the serving and replication rollup data data while locking out other changes.

func (*Wrangler) RefreshTablesByShard

func (wr *Wrangler) RefreshTablesByShard(si *topo.ShardInfo, tabletType topo.TabletType, cells []string) error

RefreshTablesByShard calls RefreshState on all the tables of a given type in a shard. It would work for the master, but the discovery wouldn't be very efficient.

func (*Wrangler) ReloadSchema

func (wr *Wrangler) ReloadSchema(tabletAlias topo.TabletAlias) error

ReloadSchema forces the remote tablet to reload its schema.

func (*Wrangler) RemoveShardCell

func (wr *Wrangler) RemoveShardCell(keyspace, shard, cell string, force bool) error

RemoveShardCell will remove a cell from the Cells list in a shard. It will first check the shard has no tablets there. if 'force' is specified, it will remove the cell even when the tablet map cannot be retrieved. This is intended to be used when a cell is completely down and its topology server cannot even be reached.

func (*Wrangler) ReparentShard

func (wr *Wrangler) ReparentShard(keyspace, shard string, masterElectTabletAlias topo.TabletAlias, leaveMasterReadOnly, forceReparentToCurrentMaster bool) error

ReparentShard creates the reparenting action and launches a goroutine to coordinate the procedure.

leaveMasterReadOnly: leave the master in read-only mode, even

though all the other necessary updates have been made.

forceReparentToCurrentMaster: mostly for test setups, this can

cause data loss.

func (*Wrangler) ReparentTablet

func (wr *Wrangler) ReparentTablet(tabletAlias topo.TabletAlias) error

ReparentTablet attempts to reparent this tablet to the current master, based on the current replication position. If there is no match, it will fail.

func (*Wrangler) ReserveForRestore

func (wr *Wrangler) ReserveForRestore(srcTabletAlias, dstTabletAlias topo.TabletAlias) (err error)

ReserveForRestore will make sure a tablet is ready to be used as a restore target.

func (*Wrangler) ResetActionTimeout

func (wr *Wrangler) ResetActionTimeout(actionTimeout time.Duration)

ResetActionTimeout should be used before every action on a wrangler object that is going to be re-used: - vtctl will not call this, as it does one action. - vtctld will not call this, as it creates a new Wrangler every time. However, some actions may need to do a cleanup phase where the original Context may have expired or been cancelled, but still do the action. Wrangler cleaner module is one of these, or the vt worker in some corner cases,

func (*Wrangler) Restore

func (wr *Wrangler) Restore(srcTabletAlias topo.TabletAlias, srcFilePath string, dstTabletAlias, parentAlias topo.TabletAlias, fetchConcurrency, fetchRetryCount int, wasReserved, dontWaitForSlaveStart bool) error

Restore actually performs the restore action on a tablet.

func (*Wrangler) Scrap

func (wr *Wrangler) Scrap(tabletAlias topo.TabletAlias, force, skipRebuild bool) error

Scrap a tablet. If force is used, we write to topo.Server directly and don't remote-execute the command.

If we scrap the master for a shard, we will clear its record from the Shard object (only if that was the right master)

func (*Wrangler) SetKeyspaceServedFrom

func (wr *Wrangler) SetKeyspaceServedFrom(keyspace string, servedType topo.TabletType, cells []string, sourceKeyspace string, remove bool) error

SetKeyspaceServedFrom locks a keyspace and changes its ServerFromMap

func (*Wrangler) SetKeyspaceShardingInfo

func (wr *Wrangler) SetKeyspaceShardingInfo(keyspace, shardingColumnName string, shardingColumnType key.KeyspaceIdType, splitShardCount int32, force bool) error

SetKeyspaceShardingInfo locks a keyspace and sets its ShardingColumnName and ShardingColumnType

func (*Wrangler) SetLogger

func (wr *Wrangler) SetLogger(logger logutil.Logger)

SetLogger can be used to change the current logger. Not synchronized, no calls to this wrangler should be in progress.

func (*Wrangler) SetShardServedTypes

func (wr *Wrangler) SetShardServedTypes(keyspace, shard string, cells []string, servedType topo.TabletType, remove bool) error

SetShardServedTypes changes the ServedTypes parameter of a shard. It does not rebuild any serving graph or do any consistency check (yet).

func (*Wrangler) SetShardTabletControl

func (wr *Wrangler) SetShardTabletControl(keyspace, shard string, tabletType topo.TabletType, cells []string, remove, disableQueryService bool, tables []string) error

SetShardTabletControl changes the TabletControl records for a shard. It does not rebuild any serving graph or do cross-shard consistency check.

  • if disableQueryService is set, tables has to be empty
  • if disableQueryService is not set, and tables is empty, we remove the TabletControl record for the cells

func (*Wrangler) SetSourceShards

func (wr *Wrangler) SetSourceShards(keyspace, shard string, sources []topo.TabletAlias, tables []string) error

SetSourceShards is a utility function to override the SourceShards fields on a Shard.

func (*Wrangler) ShardReplicationStatuses

func (wr *Wrangler) ShardReplicationStatuses(keyspace, shard string) ([]*topo.TabletInfo, []*myproto.ReplicationStatus, error)

ShardReplicationStatuses returns the ReplicationStatus for each tablet in a shard.

func (*Wrangler) Snapshot

func (wr *Wrangler) Snapshot(tabletAlias topo.TabletAlias, forceMasterSnapshot bool, snapshotConcurrency int, serverMode bool) (*actionnode.SnapshotReply, topo.TabletType, error)

Snapshot takes a tablet snapshot.

forceMasterSnapshot: Normally a master is not a viable tablet to snapshot. However, there are degenerate cases where you need to override this, for instance the initial clone of a new master.

serverMode: if specified, the server will stop its mysqld, and be ready to serve the data files directly. Slaves can just download these and use them directly. Call SnapshotSourceEnd to return into serving mode. If not specified, the server will create an archive of the files, store them locally, and restart.

If error is nil, returns the SnapshotReply from the remote host, and the original type the server was before the snapshot.

func (*Wrangler) SnapshotSourceEnd

func (wr *Wrangler) SnapshotSourceEnd(tabletAlias topo.TabletAlias, slaveStartRequired, readWrite bool, originalType topo.TabletType) (err error)

SnapshotSourceEnd will change the tablet back to its original type once it's done serving backups.

func (*Wrangler) SourceShardAdd

func (wr *Wrangler) SourceShardAdd(keyspace, shard string, uid uint32, skeyspace, sshard string, keyRange key.KeyRange, tables []string) error

func (*Wrangler) SourceShardDelete

func (wr *Wrangler) SourceShardDelete(keyspace, shard string, uid uint32) error

func (*Wrangler) TabletManagerClient

func (wr *Wrangler) TabletManagerClient() tmclient.TabletManagerClient

TabletManagerClient returns the tmclient.TabletManagerClient this wrangler is using.

func (*Wrangler) TopoServer

func (wr *Wrangler) TopoServer() topo.Server

TopoServer returns the topo.Server this wrangler is using.

func (*Wrangler) UnreserveForRestore

func (wr *Wrangler) UnreserveForRestore(dstTabletAlias topo.TabletAlias) (err error)

UnreserveForRestore switches the tablet back to its original state, the restore won't happen.

func (*Wrangler) UnreserveForRestoreMulti

func (wr *Wrangler) UnreserveForRestoreMulti(dstTabletAliases []topo.TabletAlias)

UnreserveForRestoreMulti calls UnreserveForRestore on all targets.

func (*Wrangler) Validate

func (wr *Wrangler) Validate(pingTablets bool) error

Validate a whole TopologyServer tree

func (*Wrangler) ValidateKeyspace

func (wr *Wrangler) ValidateKeyspace(keyspace string, pingTablets bool) error

ValidateKeyspace will validate a bunch of information in a keyspace is correct.

func (*Wrangler) ValidatePermissionsKeyspace

func (wr *Wrangler) ValidatePermissionsKeyspace(keyspace string) error

func (*Wrangler) ValidatePermissionsShard

func (wr *Wrangler) ValidatePermissionsShard(keyspace, shard string) error

func (*Wrangler) ValidateSchemaKeyspace

func (wr *Wrangler) ValidateSchemaKeyspace(keyspace string, excludeTables []string, includeViews bool) error

ValidateSchemaShard will diff the schema from all the tablets in the keyspace.

func (*Wrangler) ValidateSchemaShard

func (wr *Wrangler) ValidateSchemaShard(keyspace, shard string, excludeTables []string, includeViews bool) error

ValidateSchemaShard will diff the schema from all the tablets in the shard.

func (*Wrangler) ValidateShard

func (wr *Wrangler) ValidateShard(keyspace, shard string, pingTablets bool) error

ValidateShard will validate a bunch of information in a shard is correct.

func (*Wrangler) ValidateVersionKeyspace

func (wr *Wrangler) ValidateVersionKeyspace(keyspace string) error

func (*Wrangler) ValidateVersionShard

func (wr *Wrangler) ValidateVersionShard(keyspace, shard string) error

Directories

Path Synopsis
Package testlib contains utility methods to include in unit tests to deal with topology common tasks, like fake tablets and action loops.
Package testlib contains utility methods to include in unit tests to deal with topology common tasks, like fake tablets and action loops.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL