wrangler

package
v2.0.0-alpha3+incompat... Latest Latest
Warning

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

Go to latest
Published: Oct 3, 2015 License: BSD-3-Clause Imports: 36 Imported by: 0

Documentation

Overview

Package wrangler contains the Wrangler object to manage complex topology actions.

Index

Constants

View Source
const ChangeSlaveTypeActionName = "ChangeSlaveTypeAction"

ChangeSlaveTypeActionName is the name of the action to change a slave type (can be used to find such an action by name)

View Source
const StartBlpActionName = "StartBlpAction"

StartBlpActionName is the name of the action to start binlog player

View Source
const StartSlaveActionName = "StartSlaveAction"

StartSlaveActionName is the name of the slave start action

View Source
const TabletTagActionName = "TabletTagAction"

TabletTagActionName is the name of the Tag action

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.
	// Use this as the default value for Context that need a deadline.
	DefaultActionTimeout = actionnode.DefaultLockTimeout * 4
)

Functions

func RecordChangeSlaveTypeAction

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

RecordChangeSlaveTypeAction records a new ChangeSlaveTypeAction into the specified Cleaner

func RecordStartBlpAction

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

RecordStartBlpAction records a new StartBlpAction into the specified Cleaner

func RecordStartSlaveAction

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

RecordStartSlaveAction records a new StartSlaveAction into the specified Cleaner

func RecordTabletTagAction

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

RecordTabletTagAction records a new TabletTagAction into the specified Cleaner

func ResetDebugVarsGetVersion

func ResetDebugVarsGetVersion()

ResetDebugVarsGetVersion is used by tests to reset the getVersionFromTablet variable to the default one. That way we can run the unit tests in testlib/ even when another implementation of getVersionFromTablet is used.

Types

type ChangeSlaveTypeAction

type ChangeSlaveTypeAction struct {
	TabletAlias *pb.TabletAlias
	TabletType  pb.TabletType
}

ChangeSlaveTypeAction will change a server type to another type

func FindChangeSlaveTypeActionByTarget

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

FindChangeSlaveTypeActionByTarget finds the first action for the target

func (ChangeSlaveTypeAction) CleanUp

func (csta ChangeSlaveTypeAction) CleanUp(ctx context.Context, 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. CleanUp uses its own context, with a timeout of 5 minutes, so that clean up action will run even if the original context times out. 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(context.Context, *Wrangler) error
}

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

type LegacyZknsAddrs

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

LegacyZknsAddrs is what we write to ZK to use for zkns

type StartBlpAction

type StartBlpAction struct {
	TabletInfo *topo.TabletInfo
}

StartBlpAction will restart binlog replication on a server

func (StartBlpAction) CleanUp

func (sba StartBlpAction) CleanUp(ctx context.Context, wr *Wrangler) error

CleanUp is part of CleanerAction interface.

type StartSlaveAction

type StartSlaveAction struct {
	TabletInfo *topo.TabletInfo
}

StartSlaveAction will restart binlog replication on a server

func (StartSlaveAction) CleanUp

func (sba StartSlaveAction) CleanUp(ctx context.Context, wr *Wrangler) error

CleanUp is part of CleanerAction interface.

type TabletTagAction

type TabletTagAction struct {
	TabletAlias *pb.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(ctx context.Context, 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, backups, resharding, ...

Multiple go routines can use the same Wrangler at the same time, provided they want to share the same logger / topo server / lock timeout.

func New

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

New creates a new Wrangler object.

lockTimeout: how long should we wait for the initial lock to start a complex action? This is distinct from the context timeout 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) ApplySchema

func (wr *Wrangler) ApplySchema(ctx context.Context, tabletAlias *pb.TabletAlias, sc *myproto.SchemaChange) (*myproto.SchemaChangeResult, error)

ApplySchema will apply a schema change on the remote tablet.

func (*Wrangler) ApplySchemaKeyspace

func (wr *Wrangler) ApplySchemaKeyspace(ctx context.Context, keyspace string, change string, simple, force bool, waitSlaveTimeout time.Duration) (*myproto.SchemaChangeResult, error)

ApplySchemaKeyspace applies 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(ctx context.Context, keyspace, shard, change string, newParentTabletAlias *pb.TabletAlias, simple, force bool, waitSlaveTimeout time.Duration) (*myproto.SchemaChangeResult, error)

ApplySchemaShard applies a schema change on a shard. 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(ctx context.Context, tabletAlias *pb.TabletAlias, tabletType pb.TabletType, force bool) error

ChangeType changes 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(ctx context.Context, tabletAlias *pb.TabletAlias, tabletType pb.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) CopySchemaShard

func (wr *Wrangler) CopySchemaShard(ctx context.Context, sourceTabletAlias *pb.TabletAlias, tables, excludeTables []string, includeViews bool, destKeyspace, destShard string) error

CopySchemaShard copies 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) CopySchemaShardFromShard

func (wr *Wrangler) CopySchemaShardFromShard(ctx context.Context, tables, excludeTables []string, includeViews bool, sourceKeyspace, sourceShard, destKeyspace, destShard string) error

CopySchemaShardFromShard copies the schema from a source shard to the specified destination shard. For both source and destination it picks the master tablet. See also CopySchemaShard.

func (*Wrangler) DeleteKeyspace

func (wr *Wrangler) DeleteKeyspace(ctx context.Context, keyspace string, recursive bool) error

DeleteKeyspace will do all the necessary changes in the topology server to entirely remove a keyspace.

func (*Wrangler) DeleteShard

func (wr *Wrangler) DeleteShard(ctx context.Context, keyspace, shard string, recursive bool) error

DeleteShard will do all the necessary changes in the topology server to entirely remove a shard.

func (*Wrangler) DeleteTablet

func (wr *Wrangler) DeleteTablet(ctx context.Context, tabletAlias *pb.TabletAlias) error

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

func (*Wrangler) EmergencyReparentShard

func (wr *Wrangler) EmergencyReparentShard(ctx context.Context, keyspace, shard string, masterElectTabletAlias *pb.TabletAlias, waitSlaveTimeout time.Duration) error

EmergencyReparentShard will make the provided tablet the master for the shard, when the old master is completely unreachable.

func (*Wrangler) ExecuteFetchAsDba

func (wr *Wrangler) ExecuteFetchAsDba(ctx context.Context, tabletAlias *pb.TabletAlias, query string, maxRows int, wantFields, disableBinlogs bool, reloadSchema bool) (*mproto.QueryResult, error)

ExecuteFetchAsDba executes a query remotely using the DBA pool

func (*Wrangler) ExecuteHook

func (wr *Wrangler) ExecuteHook(ctx context.Context, tabletAlias *pb.TabletAlias, hook *hk.Hook) (hookResult *hk.HookResult, err error)

ExecuteHook will run the hook on the tablet

func (*Wrangler) ExecuteOptionalTabletInfoHook

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

ExecuteOptionalTabletInfoHook executes 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(ctx context.Context, ti *topo.TabletInfo, hook *hk.Hook) (hookResult *hk.HookResult, err error)

ExecuteTabletInfoHook will run the hook on the tablet described by TabletInfo

func (*Wrangler) ExportZkns

func (wr *Wrangler) ExportZkns(ctx context.Context, cell string) error

ExportZkns exports 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(ctx context.Context, keyspace string) error

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

func (*Wrangler) GetPermissions

func (wr *Wrangler) GetPermissions(ctx context.Context, tabletAlias *pb.TabletAlias) (*myproto.Permissions, error)

GetPermissions returns the permissions set on a remote tablet

func (*Wrangler) GetSchema

func (wr *Wrangler) GetSchema(ctx context.Context, tabletAlias *pb.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(ctx context.Context, tabletAlias *pb.TabletAlias) (string, error)

GetVersion returns the version string from a tablet

func (*Wrangler) InitShardMaster

func (wr *Wrangler) InitShardMaster(ctx context.Context, keyspace, shard string, masterElectTabletAlias *pb.TabletAlias, force bool, waitSlaveTimeout time.Duration) error

InitShardMaster will make the provided tablet the master for the shard.

func (*Wrangler) InitTablet

func (wr *Wrangler) InitTablet(ctx context.Context, tablet *pb.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(ctx context.Context, keyspace, shard string, servedType pb.TabletType, cells []string, reverse bool, filteredReplicationWaitTime time.Duration) error

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

func (*Wrangler) MigrateServedTypes

func (wr *Wrangler) MigrateServedTypes(ctx context.Context, keyspace, shard string, cells []string, servedType pb.TabletType, reverse, skipReFreshState bool, filteredReplicationWaitTime time.Duration) error

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

func (*Wrangler) PlannedReparentShard

func (wr *Wrangler) PlannedReparentShard(ctx context.Context, keyspace, shard string, masterElectTabletAlias *pb.TabletAlias, waitSlaveTimeout time.Duration) error

PlannedReparentShard will make the provided tablet the master for the shard, when both the current and new master are reachable and in good shape.

func (*Wrangler) PreflightSchema

func (wr *Wrangler) PreflightSchema(ctx context.Context, tabletAlias *pb.TabletAlias, change string) (*myproto.SchemaChangeResult, error)

PreflightSchema will try a schema change on the remote tablet.

func (*Wrangler) RebuildKeyspaceGraph

func (wr *Wrangler) RebuildKeyspaceGraph(ctx context.Context, keyspace string, cells []string, rebuildSrvShards bool) error

RebuildKeyspaceGraph rebuilds 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(ctx context.Context, cells []string, keyspaces []string) error

RebuildReplicationGraph 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(ctx context.Context, keyspace, shard string, cells []string) (*topo.ShardInfo, error)

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

func (*Wrangler) RefreshTablesByShard

func (wr *Wrangler) RefreshTablesByShard(ctx context.Context, si *topo.ShardInfo, tabletType pb.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(ctx context.Context, tabletAlias *pb.TabletAlias) error

ReloadSchema forces the remote tablet to reload its schema.

func (*Wrangler) RemoveKeyspaceCell

func (wr *Wrangler) RemoveKeyspaceCell(ctx context.Context, keyspace, cell string, force, recursive bool) error

RemoveKeyspaceCell will remove a cell from the Cells list in all shards of a keyspace.

It is essentially a shortcut for calling RemoveShardCell on every shard, reducing the potential for operator error when there are many shards.

func (*Wrangler) RemoveShardCell

func (wr *Wrangler) RemoveShardCell(ctx context.Context, keyspace, shard, cell string, force, recursive 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.

If 'recursive' is specified, it will delete any tablets in the cell/shard, with the assumption that the tablet processes have already been terminated.

func (*Wrangler) ReparentTablet

func (wr *Wrangler) ReparentTablet(ctx context.Context, tabletAlias *pb.TabletAlias) error

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

func (*Wrangler) Scrap

func (wr *Wrangler) Scrap(ctx context.Context, tabletAlias *pb.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(ctx context.Context, keyspace string, servedType pb.TabletType, cells []string, sourceKeyspace string, remove bool) error

SetKeyspaceServedFrom locks a keyspace and changes its ServerFromMap

func (*Wrangler) SetKeyspaceShardingInfo

func (wr *Wrangler) SetKeyspaceShardingInfo(ctx context.Context, keyspace, shardingColumnName string, shardingColumnType pb.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(ctx context.Context, keyspace, shard string, cells []string, servedType pb.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(ctx context.Context, keyspace, shard string, tabletType pb.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(ctx context.Context, keyspace, shard string, sources []*pb.TabletAlias, tables []string) error

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

func (*Wrangler) ShardReplicationStatuses

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

ShardReplicationStatuses returns the ReplicationStatus for each tablet in a shard.

func (*Wrangler) SourceShardAdd

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

SourceShardAdd will add a new SourceShard inside a shard

func (*Wrangler) SourceShardDelete

func (wr *Wrangler) SourceShardDelete(ctx context.Context, keyspace, shard string, uid uint32) error

SourceShardDelete will delete a SourceShard inside a shard, by index.

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) Validate

func (wr *Wrangler) Validate(ctx context.Context, pingTablets bool) error

Validate a whole TopologyServer tree

func (*Wrangler) ValidateKeyspace

func (wr *Wrangler) ValidateKeyspace(ctx context.Context, keyspace string, pingTablets bool) error

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

func (*Wrangler) ValidatePermissionsKeyspace

func (wr *Wrangler) ValidatePermissionsKeyspace(ctx context.Context, keyspace string) error

ValidatePermissionsKeyspace validates all the permissions are the same in a keyspace

func (*Wrangler) ValidatePermissionsShard

func (wr *Wrangler) ValidatePermissionsShard(ctx context.Context, keyspace, shard string) error

ValidatePermissionsShard validates all the permissions are the same in a shard

func (*Wrangler) ValidateSchemaKeyspace

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

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

func (*Wrangler) ValidateSchemaShard

func (wr *Wrangler) ValidateSchemaShard(ctx context.Context, 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(ctx context.Context, 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(ctx context.Context, keyspace string) error

ValidateVersionKeyspace validates all versions are the same in all tablets in a keyspace

func (*Wrangler) ValidateVersionShard

func (wr *Wrangler) ValidateVersionShard(ctx context.Context, keyspace, shard string) error

ValidateVersionShard validates all versions are the same in all tablets in a shard

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