Documentation ¶
Overview ¶
Package tabletmanager exports the ActionAgent object. It keeps the local tablet state, starts / stops all associated services (query service, update stream, binlog players, ...), and handles tabletmanager RPCs to update the state.
The agent is responsible for maintaining the tablet record in the topology server. Only 'vtctl DeleteTablet' should be run by other processes, everything else should ask the tablet server to make the change.
Most RPC calls lock the actionMutex, except the easy read-only ones. RPC calls that change the tablet record will also call updateState.
See rpc_server.go for all cases, and which actions take the actionMutex, and which run changeCallback.
Index ¶
- Variables
- func ConfigHTML() template.HTML
- func SetReparentFlags(timeout time.Duration)
- type ActionAgent
- func NewActionAgent(batchCtx context.Context, ts *topo.Server, mysqld mysqlctl.MysqlDaemon, ...) (agent *ActionAgent, err error)
- func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, ...) *ActionAgent
- func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, ...) *ActionAgent
- func (agent *ActionAgent) ApplySchema(ctx context.Context, change *tmutils.SchemaChange) (*tabletmanagerdatapb.SchemaChangeResult, error)
- func (agent *ActionAgent) Backup(ctx context.Context, concurrency int, logger logutil.Logger) error
- func (agent *ActionAgent) BlacklistedTables() []string
- func (agent *ActionAgent) ChangeType(ctx context.Context, tabletType topodatapb.TabletType) error
- func (agent *ActionAgent) Close()
- func (agent *ActionAgent) DemoteMaster(ctx context.Context) (string, error)
- func (agent *ActionAgent) DisallowQueryService() string
- func (agent *ActionAgent) EnableUpdateStream() bool
- func (agent *ActionAgent) ExecuteFetchAsAllPrivs(ctx context.Context, query []byte, dbName string, maxrows int, ...) (*querypb.QueryResult, error)
- func (agent *ActionAgent) ExecuteFetchAsApp(ctx context.Context, query []byte, maxrows int) (*querypb.QueryResult, error)
- func (agent *ActionAgent) ExecuteFetchAsDba(ctx context.Context, query []byte, dbName string, maxrows int, ...) (*querypb.QueryResult, error)
- func (agent *ActionAgent) ExecuteHook(ctx context.Context, hk *hook.Hook) *hook.HookResult
- func (agent *ActionAgent) GetPermissions(ctx context.Context) (*tabletmanagerdatapb.Permissions, error)
- func (agent *ActionAgent) GetSchema(ctx context.Context, tables, excludeTables []string, includeViews bool) (*tabletmanagerdatapb.SchemaDefinition, error)
- func (agent *ActionAgent) GetSlaves(ctx context.Context) ([]string, error)
- func (agent *ActionAgent) HandleRPCPanic(ctx context.Context, name string, args, reply interface{}, verbose bool, ...)
- func (agent *ActionAgent) Healthy() (time.Duration, error)
- func (agent *ActionAgent) IgnoreHealthError(ctx context.Context, pattern string) error
- func (agent *ActionAgent) InitMaster(ctx context.Context) (string, error)
- func (agent *ActionAgent) InitSlave(ctx context.Context, parent *topodatapb.TabletAlias, position string, ...) error
- func (agent *ActionAgent) InitTablet(port, gRPCPort int32) error
- func (agent *ActionAgent) MasterPosition(ctx context.Context) (string, error)
- func (agent *ActionAgent) Ping(ctx context.Context, args string) string
- func (agent *ActionAgent) PopulateReparentJournal(ctx context.Context, timeCreatedNS int64, actionName string, ...) error
- func (agent *ActionAgent) PreflightSchema(ctx context.Context, changes []string) ([]*tabletmanagerdatapb.SchemaChangeResult, error)
- func (agent *ActionAgent) PromoteSlave(ctx context.Context) (string, error)
- func (agent *ActionAgent) PromoteSlaveWhenCaughtUp(ctx context.Context, position string) (string, error)
- func (agent *ActionAgent) RefreshState(ctx context.Context) error
- func (agent *ActionAgent) ReloadSchema(ctx context.Context, waitPosition string) error
- func (agent *ActionAgent) ResetReplication(ctx context.Context) error
- func (agent *ActionAgent) RestoreData(ctx context.Context, logger logutil.Logger, deleteBeforeRestore bool) error
- func (agent *ActionAgent) RestoreFromBackup(ctx context.Context, logger logutil.Logger) error
- func (agent *ActionAgent) RunHealthCheck(ctx context.Context)
- func (agent *ActionAgent) SetMaster(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, ...) error
- func (agent *ActionAgent) SetReadOnly(ctx context.Context, rdonly bool) error
- func (agent *ActionAgent) SlaveStatus(ctx context.Context) (*replicationdatapb.Status, error)
- func (agent *ActionAgent) SlaveWasPromoted(ctx context.Context) error
- func (agent *ActionAgent) SlaveWasRestarted(ctx context.Context, parent *topodatapb.TabletAlias) error
- func (agent *ActionAgent) Sleep(ctx context.Context, duration time.Duration)
- func (agent *ActionAgent) Start(ctx context.Context, mysqlHost string, mysqlPort, vtPort, gRPCPort int32, ...) error
- func (agent *ActionAgent) StartSlave(ctx context.Context) error
- func (agent *ActionAgent) Stop()
- func (agent *ActionAgent) StopReplicationAndGetStatus(ctx context.Context) (*replicationdatapb.Status, error)
- func (agent *ActionAgent) StopSlave(ctx context.Context) error
- func (agent *ActionAgent) StopSlaveMinimum(ctx context.Context, position string, waitTime time.Duration) (string, error)
- func (agent *ActionAgent) Tablet() *topodatapb.Tablet
- func (agent *ActionAgent) TabletExternallyReparented(ctx context.Context, externalID string) error
- func (agent *ActionAgent) VReplicationExec(ctx context.Context, query string) (*querypb.QueryResult, error)
- func (agent *ActionAgent) VReplicationWaitForPos(ctx context.Context, id int, pos string) error
- type HealthRecord
- type RPCAgent
- type RegisterQueryService
- type Reporter
Constants ¶
This section is empty.
Variables ¶
var RegisterQueryServices []RegisterQueryService
RegisterQueryServices is a list of functions to call when the delayed registration is triggered.
Functions ¶
func ConfigHTML ¶
ConfigHTML returns a formatted summary of health checking config values.
func SetReparentFlags ¶
SetReparentFlags changes flag values. It should only be used in tests.
Types ¶
type ActionAgent ¶
type ActionAgent struct { // The following fields are set during creation QueryServiceControl tabletserver.Controller UpdateStream binlog.UpdateStreamControl HealthReporter health.Reporter TopoServer *topo.Server TabletAlias *topodatapb.TabletAlias Cnf *mysqlctl.Mycnf MysqlDaemon mysqlctl.MysqlDaemon DBConfigs *dbconfigs.DBConfigs VREngine *vreplication.Engine // History of the health checks, public so status // pages can display it History *history.History // contains filtered or unexported fields }
ActionAgent is the main class for the agent.
func NewActionAgent ¶
func NewActionAgent( batchCtx context.Context, ts *topo.Server, mysqld mysqlctl.MysqlDaemon, queryServiceControl tabletserver.Controller, tabletAlias *topodatapb.TabletAlias, dbcfgs *dbconfigs.DBConfigs, mycnf *mysqlctl.Mycnf, port, gRPCPort int32, ) (agent *ActionAgent, err error)
NewActionAgent creates a new ActionAgent and registers all the associated services.
batchCtx is the context that the agent will use for any background tasks it spawns.
func NewComboActionAgent ¶
func NewComboActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, vtPort, grpcPort int32, queryServiceControl tabletserver.Controller, dbcfgs *dbconfigs.DBConfigs, mysqlDaemon mysqlctl.MysqlDaemon, keyspace, shard, dbname, tabletType string) *ActionAgent
NewComboActionAgent creates an agent tailored specifically to run within the vtcombo binary. It cannot be called concurrently, as it changes the flags.
func NewTestActionAgent ¶
func NewTestActionAgent(batchCtx context.Context, ts *topo.Server, tabletAlias *topodatapb.TabletAlias, vtPort, grpcPort int32, mysqlDaemon mysqlctl.MysqlDaemon, preStart func(*ActionAgent)) *ActionAgent
NewTestActionAgent creates an agent for test purposes. Only a subset of features are supported now, but we'll add more over time.
func (*ActionAgent) ApplySchema ¶
func (agent *ActionAgent) ApplySchema(ctx context.Context, change *tmutils.SchemaChange) (*tabletmanagerdatapb.SchemaChangeResult, error)
ApplySchema will apply a schema change
func (*ActionAgent) BlacklistedTables ¶
func (agent *ActionAgent) BlacklistedTables() []string
BlacklistedTables returns the list of currently blacklisted tables.
func (*ActionAgent) ChangeType ¶
func (agent *ActionAgent) ChangeType(ctx context.Context, tabletType topodatapb.TabletType) error
ChangeType changes the tablet type
func (*ActionAgent) Close ¶
func (agent *ActionAgent) Close()
Close prepares a tablet for shutdown. First we check our tablet ownership and then prune the tablet topology entry of all post-init fields. This prevents stale identifiers from hanging around in topology.
func (*ActionAgent) DemoteMaster ¶
func (agent *ActionAgent) DemoteMaster(ctx context.Context) (string, error)
DemoteMaster marks the server read-only, wait until it is done with its current transactions, and returns its master position.
func (*ActionAgent) DisallowQueryService ¶
func (agent *ActionAgent) DisallowQueryService() string
DisallowQueryService returns the reason the query service should be disabled, if any.
func (*ActionAgent) EnableUpdateStream ¶
func (agent *ActionAgent) EnableUpdateStream() bool
EnableUpdateStream returns if we should enable update stream or not
func (*ActionAgent) ExecuteFetchAsAllPrivs ¶
func (agent *ActionAgent) ExecuteFetchAsAllPrivs(ctx context.Context, query []byte, dbName string, maxrows int, reloadSchema bool) (*querypb.QueryResult, error)
ExecuteFetchAsAllPrivs will execute the given query, possibly reloading schema.
func (*ActionAgent) ExecuteFetchAsApp ¶
func (agent *ActionAgent) ExecuteFetchAsApp(ctx context.Context, query []byte, maxrows int) (*querypb.QueryResult, error)
ExecuteFetchAsApp will execute the given query.
func (*ActionAgent) ExecuteFetchAsDba ¶
func (agent *ActionAgent) ExecuteFetchAsDba(ctx context.Context, query []byte, dbName string, maxrows int, disableBinlogs bool, reloadSchema bool) (*querypb.QueryResult, error)
ExecuteFetchAsDba will execute the given query, possibly disabling binlogs and reload schema.
func (*ActionAgent) ExecuteHook ¶
func (agent *ActionAgent) ExecuteHook(ctx context.Context, hk *hook.Hook) *hook.HookResult
ExecuteHook executes the provided hook locally, and returns the result.
func (*ActionAgent) GetPermissions ¶
func (agent *ActionAgent) GetPermissions(ctx context.Context) (*tabletmanagerdatapb.Permissions, error)
GetPermissions returns the db permissions.
func (*ActionAgent) GetSchema ¶
func (agent *ActionAgent) GetSchema(ctx context.Context, tables, excludeTables []string, includeViews bool) (*tabletmanagerdatapb.SchemaDefinition, error)
GetSchema returns the schema.
func (*ActionAgent) GetSlaves ¶
func (agent *ActionAgent) GetSlaves(ctx context.Context) ([]string, error)
GetSlaves returns the address of all the slaves
func (*ActionAgent) HandleRPCPanic ¶
func (agent *ActionAgent) HandleRPCPanic(ctx context.Context, name string, args, reply interface{}, verbose bool, err *error)
HandleRPCPanic is part of the RPCAgent interface.
func (*ActionAgent) Healthy ¶
func (agent *ActionAgent) Healthy() (time.Duration, error)
Healthy reads the result of the latest healthcheck, protected by mutex. If that status is too old, it means healthcheck hasn't run for a while, and is probably stuck, this is not good, we're not healthy.
func (*ActionAgent) IgnoreHealthError ¶
func (agent *ActionAgent) IgnoreHealthError(ctx context.Context, pattern string) error
IgnoreHealthError sets the regexp for health check errors to ignore.
func (*ActionAgent) InitMaster ¶
func (agent *ActionAgent) InitMaster(ctx context.Context) (string, error)
InitMaster enables writes and returns the replication position.
func (*ActionAgent) InitSlave ¶
func (agent *ActionAgent) InitSlave(ctx context.Context, parent *topodatapb.TabletAlias, position string, timeCreatedNS int64) error
InitSlave sets replication master and position, and waits for the reparent_journal table entry up to context timeout
func (*ActionAgent) InitTablet ¶
func (agent *ActionAgent) InitTablet(port, gRPCPort int32) error
InitTablet initializes the tablet record if necessary.
func (*ActionAgent) MasterPosition ¶
func (agent *ActionAgent) MasterPosition(ctx context.Context) (string, error)
MasterPosition returns the master position
func (*ActionAgent) Ping ¶
func (agent *ActionAgent) Ping(ctx context.Context, args string) string
Ping makes sure RPCs work, and refreshes the tablet record.
func (*ActionAgent) PopulateReparentJournal ¶
func (agent *ActionAgent) PopulateReparentJournal(ctx context.Context, timeCreatedNS int64, actionName string, masterAlias *topodatapb.TabletAlias, position string) error
PopulateReparentJournal adds an entry into the reparent_journal table.
func (*ActionAgent) PreflightSchema ¶
func (agent *ActionAgent) PreflightSchema(ctx context.Context, changes []string) ([]*tabletmanagerdatapb.SchemaChangeResult, error)
PreflightSchema will try out the schema changes in "changes".
func (*ActionAgent) PromoteSlave ¶
func (agent *ActionAgent) PromoteSlave(ctx context.Context) (string, error)
PromoteSlave makes the current tablet the master
func (*ActionAgent) PromoteSlaveWhenCaughtUp ¶
func (agent *ActionAgent) PromoteSlaveWhenCaughtUp(ctx context.Context, position string) (string, error)
PromoteSlaveWhenCaughtUp waits for this slave to be caught up on replication up to the provided point, and then makes the slave the shard master.
func (*ActionAgent) RefreshState ¶
func (agent *ActionAgent) RefreshState(ctx context.Context) error
RefreshState reload the tablet record from the topo server.
func (*ActionAgent) ReloadSchema ¶
func (agent *ActionAgent) ReloadSchema(ctx context.Context, waitPosition string) error
ReloadSchema will reload the schema This doesn't need the action mutex because periodic schema reloads happen in the background anyway.
func (*ActionAgent) ResetReplication ¶
func (agent *ActionAgent) ResetReplication(ctx context.Context) error
ResetReplication completely resets the replication on the host. All binary and relay logs are flushed. All replication positions are reset.
func (*ActionAgent) RestoreData ¶
func (agent *ActionAgent) RestoreData(ctx context.Context, logger logutil.Logger, deleteBeforeRestore bool) error
RestoreData is the main entry point for backup restore. It will either work, fail gracefully, or return an error in case of a non-recoverable error. It takes the action lock so no RPC interferes.
func (*ActionAgent) RestoreFromBackup ¶
RestoreFromBackup deletes all local data and restores anew from the latest backup.
func (*ActionAgent) RunHealthCheck ¶
func (agent *ActionAgent) RunHealthCheck(ctx context.Context)
RunHealthCheck will manually run the health check on the tablet.
func (*ActionAgent) SetMaster ¶
func (agent *ActionAgent) SetMaster(ctx context.Context, parentAlias *topodatapb.TabletAlias, timeCreatedNS int64, forceStartSlave bool) error
SetMaster sets replication master, and waits for the reparent_journal table entry up to context timeout
func (*ActionAgent) SetReadOnly ¶
func (agent *ActionAgent) SetReadOnly(ctx context.Context, rdonly bool) error
SetReadOnly makes the mysql instance read-only or read-write.
func (*ActionAgent) SlaveStatus ¶
func (agent *ActionAgent) SlaveStatus(ctx context.Context) (*replicationdatapb.Status, error)
SlaveStatus returns the replication status
func (*ActionAgent) SlaveWasPromoted ¶
func (agent *ActionAgent) SlaveWasPromoted(ctx context.Context) error
SlaveWasPromoted promotes a slave to master, no questions asked.
func (*ActionAgent) SlaveWasRestarted ¶
func (agent *ActionAgent) SlaveWasRestarted(ctx context.Context, parent *topodatapb.TabletAlias) error
SlaveWasRestarted updates the parent record for a tablet.
func (*ActionAgent) Sleep ¶
func (agent *ActionAgent) Sleep(ctx context.Context, duration time.Duration)
Sleep sleeps for the duration
func (*ActionAgent) Start ¶
func (agent *ActionAgent) Start(ctx context.Context, mysqlHost string, mysqlPort, vtPort, gRPCPort int32, initUpdateStream bool) error
Start validates and updates the topology records for the tablet, and performs the initial state change callback to start tablet services. If initUpdateStream is set, update stream service will also be registered.
func (*ActionAgent) StartSlave ¶
func (agent *ActionAgent) StartSlave(ctx context.Context) error
StartSlave will start the mysql. Works both when Vitess manages replication or not (using hook if not).
func (*ActionAgent) Stop ¶
func (agent *ActionAgent) Stop()
Stop shuts down the agent. Normally this is not necessary, since we use servenv OnTerm and OnClose hooks to coordinate shutdown automatically, while taking lameduck into account. However, this may be useful for tests, when you want to clean up an agent immediately.
func (*ActionAgent) StopReplicationAndGetStatus ¶
func (agent *ActionAgent) StopReplicationAndGetStatus(ctx context.Context) (*replicationdatapb.Status, error)
StopReplicationAndGetStatus stops MySQL replication, and returns the current status.
func (*ActionAgent) StopSlave ¶
func (agent *ActionAgent) StopSlave(ctx context.Context) error
StopSlave will stop the mysql. Works both when Vitess manages replication or not (using hook if not).
func (*ActionAgent) StopSlaveMinimum ¶
func (agent *ActionAgent) StopSlaveMinimum(ctx context.Context, position string, waitTime time.Duration) (string, error)
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 (*ActionAgent) Tablet ¶
func (agent *ActionAgent) Tablet() *topodatapb.Tablet
Tablet reads the stored Tablet from the agent, protected by mutex.
func (*ActionAgent) TabletExternallyReparented ¶
func (agent *ActionAgent) TabletExternallyReparented(ctx context.Context, externalID string) error
TabletExternallyReparented updates all topo records so the current tablet is the new master for this shard.
func (*ActionAgent) VReplicationExec ¶
func (agent *ActionAgent) VReplicationExec(ctx context.Context, query string) (*querypb.QueryResult, error)
VReplicationExec executes a vreplication command.
func (*ActionAgent) VReplicationWaitForPos ¶
VReplicationWaitForPos waits for the specified position.
type HealthRecord ¶
type HealthRecord struct { Time time.Time Error error IgnoredError error IgnoreErrorExpr string ReplicationDelay time.Duration }
HealthRecord records one run of the health checker.
func (*HealthRecord) Class ¶
func (r *HealthRecord) Class() string
Class returns a human-readable one word version of the health state.
func (*HealthRecord) Degraded ¶
func (r *HealthRecord) Degraded() bool
Degraded returns true if the replication delay is beyond degradedThreshold.
func (*HealthRecord) ErrorString ¶
func (r *HealthRecord) ErrorString() string
ErrorString returns Error as a string.
func (*HealthRecord) HTML ¶
func (r *HealthRecord) HTML() template.HTML
HTML returns an HTML version to be displayed on UIs.
func (*HealthRecord) IgnoredErrorString ¶
func (r *HealthRecord) IgnoredErrorString() string
IgnoredErrorString returns IgnoredError as a string.
func (*HealthRecord) IsDuplicate ¶
func (r *HealthRecord) IsDuplicate(other interface{}) bool
IsDuplicate implements history.Deduplicable
type RPCAgent ¶
type RPCAgent interface { Ping(ctx context.Context, args string) string GetSchema(ctx context.Context, tables, excludeTables []string, includeViews bool) (*tabletmanagerdatapb.SchemaDefinition, error) GetPermissions(ctx context.Context) (*tabletmanagerdatapb.Permissions, error) SetReadOnly(ctx context.Context, rdonly bool) error ChangeType(ctx context.Context, tabletType topodatapb.TabletType) error Sleep(ctx context.Context, duration time.Duration) ExecuteHook(ctx context.Context, hk *hook.Hook) *hook.HookResult RefreshState(ctx context.Context) error RunHealthCheck(ctx context.Context) IgnoreHealthError(ctx context.Context, pattern string) error ReloadSchema(ctx context.Context, waitPosition string) error PreflightSchema(ctx context.Context, changes []string) ([]*tabletmanagerdatapb.SchemaChangeResult, error) ApplySchema(ctx context.Context, change *tmutils.SchemaChange) (*tabletmanagerdatapb.SchemaChangeResult, error) ExecuteFetchAsDba(ctx context.Context, query []byte, dbName string, maxrows int, disableBinlogs bool, reloadSchema bool) (*querypb.QueryResult, error) ExecuteFetchAsAllPrivs(ctx context.Context, query []byte, dbName string, maxrows int, reloadSchema bool) (*querypb.QueryResult, error) ExecuteFetchAsApp(ctx context.Context, query []byte, maxrows int) (*querypb.QueryResult, error) SlaveStatus(ctx context.Context) (*replicationdatapb.Status, error) MasterPosition(ctx context.Context) (string, error) StopSlave(ctx context.Context) error StopSlaveMinimum(ctx context.Context, position string, waitTime time.Duration) (string, error) StartSlave(ctx context.Context) error TabletExternallyReparented(ctx context.Context, externalID string) error GetSlaves(ctx context.Context) ([]string, error) // VReplication API VReplicationExec(ctx context.Context, query string) (*querypb.QueryResult, error) VReplicationWaitForPos(ctx context.Context, id int, pos string) error ResetReplication(ctx context.Context) error InitMaster(ctx context.Context) (string, error) PopulateReparentJournal(ctx context.Context, timeCreatedNS int64, actionName string, masterAlias *topodatapb.TabletAlias, pos string) error InitSlave(ctx context.Context, parent *topodatapb.TabletAlias, replicationPosition string, timeCreatedNS int64) error DemoteMaster(ctx context.Context) (string, error) PromoteSlaveWhenCaughtUp(ctx context.Context, replicationPosition string) (string, error) SlaveWasPromoted(ctx context.Context) error SetMaster(ctx context.Context, parent *topodatapb.TabletAlias, timeCreatedNS int64, forceStartSlave bool) error SlaveWasRestarted(ctx context.Context, parent *topodatapb.TabletAlias) error StopReplicationAndGetStatus(ctx context.Context) (*replicationdatapb.Status, error) PromoteSlave(ctx context.Context) (string, error) Backup(ctx context.Context, concurrency int, logger logutil.Logger) error RestoreFromBackup(ctx context.Context, logger logutil.Logger) error // HandleRPCPanic is to be called in a defer statement in each // RPC input point. HandleRPCPanic(ctx context.Context, name string, args, reply interface{}, verbose bool, err *error) }
RPCAgent defines the interface implemented by the Agent for RPCs. It is useful for RPC implementations to test their full stack.
type RegisterQueryService ¶
type RegisterQueryService func(*ActionAgent)
RegisterQueryService is used to delay registration of RPC servers until we have all the objects.
Source Files ¶
Directories ¶
Path | Synopsis |
---|---|
Package events contains event structs used by the tabletmanager package.
|
Package events contains event structs used by the tabletmanager package. |