logic

package
v0.14.4 Latest Latest
Warning

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

Go to latest
Published: Nov 29, 2022 License: Apache-2.0 Imports: 41 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func AcknowledgeAllRecoveries

func AcknowledgeAllRecoveries(owner string, comment string) (countAcknowledgedEntries int64, err error)

AcknowledgeAllRecoveries acknowledges all unacknowledged recoveries.

func AcknowledgeClusterRecoveries

func AcknowledgeClusterRecoveries(clusterName string, owner string, comment string) (countAcknowledgedEntries int64, err error)

AcknowledgeClusterRecoveries marks active recoveries for given cluster as acknowledged. This also implied clearing their active period, which in turn enables further recoveries on those topologies

func AcknowledgeCrashedRecoveries

func AcknowledgeCrashedRecoveries() (countAcknowledgedEntries int64, err error)

AcknowledgeCrashedRecoveries marks recoveries whose processing nodes has crashed as acknowledged.

func AcknowledgeInstanceCompletedRecoveries

func AcknowledgeInstanceCompletedRecoveries(instanceKey *inst.InstanceKey, owner string, comment string) (countAcknowledgedEntries int64, err error)

AcknowledgeInstanceCompletedRecoveries marks active and COMPLETED recoveries for given instane as acknowledged. This also implied clearing their active period, which in turn enables further recoveries on those topologies

func AcknowledgeInstanceRecoveries

func AcknowledgeInstanceRecoveries(instanceKey *inst.InstanceKey, owner string, comment string) (countAcknowledgedEntries int64, err error)

AcknowledgeInstanceRecoveries marks active recoveries for given instane as acknowledged. This also implied clearing their active period, which in turn enables further recoveries on those topologies

func AcknowledgeRecovery

func AcknowledgeRecovery(recoveryID int64, owner string, comment string) (countAcknowledgedEntries int64, err error)

AcknowledgeRecovery acknowledges a particular recovery. This also implied clearing their active period, which in turn enables further recoveries on those topologies

func AcknowledgeRecoveryByUID

func AcknowledgeRecoveryByUID(recoveryUID string, owner string, comment string) (countAcknowledgedEntries int64, err error)

AcknowledgeRecovery acknowledges a particular recovery. This also implied clearing their active period, which in turn enables further recoveries on those topologies

func AttemptFailureDetectionRegistration

func AttemptFailureDetectionRegistration(analysisEntry *inst.ReplicationAnalysis) (registrationSuccessful bool, err error)

AttemptFailureDetectionRegistration tries to add a failure-detection entry; if this fails that means the problem has already been detected

func AuditTopologyRecovery

func AuditTopologyRecovery(topologyRecovery *TopologyRecovery, message string) error

AuditTopologyRecovery audits a single step in a topology recovery process.

func CheckAndRecover

func CheckAndRecover(specificInstance *inst.InstanceKey, candidateInstanceKey *inst.InstanceKey, skipProcesses bool) (recoveryAttempted bool, promotedReplicaKey *inst.InstanceKey, err error)

CheckAndRecover is the main entry point for the recovery mechanism

func ClearActiveFailureDetections

func ClearActiveFailureDetections() error

ClearActiveFailureDetections clears the "in_active_period" flag for old-enough detections, thereby allowing for further detections on cleared instances.

func ClearActiveRecoveries

func ClearActiveRecoveries() error

ClearActiveRecoveries clears the "in_active_period" flag for old-enough recoveries, thereby allowing for further recoveries on cleared instances.

func ContinuousDiscovery

func ContinuousDiscovery()

ContinuousDiscovery starts an asynchronuous infinite discovery process where instances are periodically investigated and their status captured, and long since unseen instances are purged and forgotten. nolint SA1015: using time.Tick leaks the underlying ticker

func DisableRecovery

func DisableRecovery() error

DisableRecovery ensures recoveries are disabled globally

func DiscoverInstance

func DiscoverInstance(instanceKey inst.InstanceKey, forceDiscovery bool)

DiscoverInstance will attempt to discover (poll) an instance (unless it is already up to date) and will also ensure that its primary and replicas (if any) are also checked.

func EnableRecovery

func EnableRecovery() error

EnableRecovery ensures recoveries are enabled globally

func ExpireBlockedRecoveries

func ExpireBlockedRecoveries() error

ExpireBlockedRecoveries clears listing of blocked recoveries that are no longer actually blocked.

func ExpireFailureDetectionHistory

func ExpireFailureDetectionHistory() error

ExpireFailureDetectionHistory removes old rows from the topology_failure_detection table

func ExpireTopologyRecoveryHistory

func ExpireTopologyRecoveryHistory() error

ExpireTopologyRecoveryHistory removes old rows from the topology_failure_detection table

func ExpireTopologyRecoveryStepsHistory

func ExpireTopologyRecoveryStepsHistory() error

ExpireTopologyRecoveryStepsHistory removes old rows from the topology_failure_detection table

func GetCandidateSiblingOfIntermediatePrimary added in v0.12.0

func GetCandidateSiblingOfIntermediatePrimary(topologyRecovery *TopologyRecovery, intermediatePrimaryInstance *inst.Instance) (*inst.Instance, error)

GetCandidateSiblingOfIntermediatePrimary chooses the best sibling of a dead intermediate primary to whom the IM's replicas can be moved.

func IsLeader

func IsLeader() bool

func IsLeaderOrActive

func IsLeaderOrActive() bool

func IsRecoveryDisabled

func IsRecoveryDisabled() (disabled bool, err error)

IsRecoveryDisabled returns true if Recoveries are disabled globally

func LockShard

func LockShard(ctx context.Context, instanceKey inst.InstanceKey) (context.Context, func(*error), error)

LockShard locks the keyspace-shard preventing others from performing conflicting actions.

func OpenTabletDiscovery

func OpenTabletDiscovery() <-chan time.Time

OpenTabletDiscovery opens the vitess topo if enables and returns a ticker channel for polling.

func PrimaryFailoverGeographicConstraintSatisfied added in v0.12.0

func PrimaryFailoverGeographicConstraintSatisfied(analysisEntry *inst.ReplicationAnalysis, suggestedInstance *inst.Instance) (satisfied bool, dissatisfiedReason string)

func RecoverDeadCoPrimary added in v0.12.0

func RecoverDeadCoPrimary(topologyRecovery *TopologyRecovery, skipProcesses bool) (promotedReplica *inst.Instance, lostReplicas [](*inst.Instance), err error)

RecoverDeadCoPrimary recovers a dead co-primary, complete logic inside

func RecoverDeadIntermediatePrimary added in v0.12.0

func RecoverDeadIntermediatePrimary(topologyRecovery *TopologyRecovery, skipProcesses bool) (successorInstance *inst.Instance, err error)

RecoverDeadIntermediatePrimary performs intermediate primary recovery; complete logic inside

func RefreshAllKeyspaces added in v0.14.0

func RefreshAllKeyspaces()

RefreshAllKeyspaces reloads the keyspace information for the keyspaces that vtorc is concerned with.

func RefreshKeyspace added in v0.14.0

func RefreshKeyspace(keyspaceName string) error

RefreshKeyspace refreshes the keyspace's information for the given keyspace from the topo

func RefreshTablets

func RefreshTablets(forceRefresh bool)

RefreshTablets reloads the tablets from topo.

func RegisterBlockedRecoveries

func RegisterBlockedRecoveries(analysisEntry *inst.ReplicationAnalysis, blockingRecoveries []*TopologyRecovery) error

RegisterBlockedRecoveries writes down currently blocked recoveries, and indicates what recovery they are blocked on. Recoveries are blocked thru the in_active_period flag, which comes to avoid flapping.

func SetRecoveryDisabled

func SetRecoveryDisabled(disabled bool) error

func ShardPrimary added in v0.12.0

func ShardPrimary(instanceKey *inst.InstanceKey) (primaryKey *inst.InstanceKey, err error)

func SubmitPrimariesToKvStores added in v0.12.0

func SubmitPrimariesToKvStores(clusterName string, force bool) (kvPairs [](*kv.KeyValuePair), submittedCount int, err error)

SubmitPrimariesToKvStores records a cluster's primary (or all clusters primaries) to kv stores. This should generally only happen once in a lifetime of a cluster. Otherwise KV stores are updated via failovers.

func SuggestReplacementForPromotedReplica

func SuggestReplacementForPromotedReplica(topologyRecovery *TopologyRecovery, deadInstanceKey *inst.InstanceKey, promotedReplica *inst.Instance, candidateInstanceKey *inst.InstanceKey) (replacement *inst.Instance, actionRequired bool, err error)

SuggestReplacementForPromotedReplica returns a server to take over the already promoted replica, if such server is found and makes an improvement over the promoted replica.

func TabletDemotePrimary added in v0.12.0

func TabletDemotePrimary(instanceKey inst.InstanceKey) error

TabletDemotePrimary requests the primary tablet to stop accepting transactions.

func TabletRefresh

func TabletRefresh(instanceKey inst.InstanceKey) (*topodatapb.Tablet, error)

TabletRefresh refreshes the tablet info.

func TabletUndoDemotePrimary added in v0.12.0

func TabletUndoDemotePrimary(instanceKey inst.InstanceKey) error

TabletUndoDemotePrimary requests the primary tablet to undo the demote.

Types

type BlockedTopologyRecovery

type BlockedTopologyRecovery struct {
	FailedInstanceKey    inst.InstanceKey
	ClusterName          string
	Analysis             inst.AnalysisCode
	LastBlockedTimestamp string
	BlockingRecoveryID   int64
}

BlockedTopologyRecovery represents an entry in the blocked_topology_recovery table

func ReadBlockedRecoveries

func ReadBlockedRecoveries(clusterName string) ([]BlockedTopologyRecovery, error)

ReadBlockedRecoveries reads blocked recovery entries, potentially filtered by cluster name (empty to unfilter)

type CommandApplier

type CommandApplier struct {
}

AsyncRequest represents an entry in the async_request table

func NewCommandApplier

func NewCommandApplier() *CommandApplier

func (*CommandApplier) ApplyCommand

func (applier *CommandApplier) ApplyCommand(op string, value []byte) any

type InstancesByCountReplicas

type InstancesByCountReplicas [](*inst.Instance)

InstancesByCountReplicas sorts instances by umber of replicas, descending

func (InstancesByCountReplicas) Len

func (instancesByCountReplicas InstancesByCountReplicas) Len() int

func (InstancesByCountReplicas) Less

func (instancesByCountReplicas InstancesByCountReplicas) Less(i, j int) bool

func (InstancesByCountReplicas) Swap

func (instancesByCountReplicas InstancesByCountReplicas) Swap(i, j int)

type PrimaryRecoveryType added in v0.12.0

type PrimaryRecoveryType string
const (
	NotPrimaryRecovery          PrimaryRecoveryType = "NotPrimaryRecovery"
	PrimaryRecoveryGTID         PrimaryRecoveryType = "PrimaryRecoveryGTID"
	PrimaryRecoveryBinlogServer PrimaryRecoveryType = "PrimaryRecoveryBinlogServer"
	PrimaryRecoveryUnknown      PrimaryRecoveryType = "PrimaryRecoveryUnknown"
)

func GetPrimaryRecoveryType added in v0.12.0

func GetPrimaryRecoveryType(analysisEntry *inst.ReplicationAnalysis) (primaryRecoveryType PrimaryRecoveryType)

type RecoveryAcknowledgement

type RecoveryAcknowledgement struct {
	CreatedAt time.Time
	Owner     string
	Comment   string

	Key           inst.InstanceKey
	ClusterName   string
	ID            int64
	UID           string
	AllRecoveries bool
}

func NewInternalAcknowledgement

func NewInternalAcknowledgement() *RecoveryAcknowledgement

func NewRecoveryAcknowledgement

func NewRecoveryAcknowledgement(owner string, comment string) *RecoveryAcknowledgement

type RecoveryType

type RecoveryType string
const (
	PrimaryRecovery             RecoveryType = "PrimaryRecovery"
	CoPrimaryRecovery           RecoveryType = "CoPrimaryRecovery"
	IntermediatePrimaryRecovery RecoveryType = "IntermediatePrimaryRecovery"
)

type TopologyRecovery

type TopologyRecovery struct {
	inst.PostponedFunctionsContainer

	ID                        int64
	UID                       string
	AnalysisEntry             inst.ReplicationAnalysis
	SuccessorKey              *inst.InstanceKey
	SuccessorAlias            string
	IsActive                  bool
	IsSuccessful              bool
	LostReplicas              inst.InstanceKeyMap
	ParticipatingInstanceKeys inst.InstanceKeyMap
	AllErrors                 []string
	RecoveryStartTimestamp    string
	RecoveryEndTimestamp      string
	ProcessingNodeHostname    string
	ProcessingNodeToken       string
	Acknowledged              bool
	AcknowledgedAt            string
	AcknowledgedBy            string
	AcknowledgedComment       string
	LastDetectionID           int64
	RelatedRecoveryID         int64
	Type                      RecoveryType
	RecoveryType              PrimaryRecoveryType
}

TopologyRecovery represents an entry in the topology_recovery table

func AttemptRecoveryRegistration

func AttemptRecoveryRegistration(analysisEntry *inst.ReplicationAnalysis, failIfFailedInstanceInActiveRecovery bool, failIfClusterInActiveRecovery bool) (*TopologyRecovery, error)

AttemptRecoveryRegistration tries to add a recovery entry; if this fails that means recovery is already in place.

func ForceExecuteRecovery

func ForceExecuteRecovery(analysisEntry inst.ReplicationAnalysis, candidateInstanceKey *inst.InstanceKey, skipProcesses bool) (recoveryAttempted bool, topologyRecovery *TopologyRecovery, err error)

ForceExecuteRecovery can be called to issue a recovery process even if analysis says there is no recovery case. The caller of this function injects the type of analysis it wishes the function to assume. By calling this function one takes responsibility for one's actions.

func ForcePrimaryFailover added in v0.12.0

func ForcePrimaryFailover(clusterName string) (topologyRecovery *TopologyRecovery, err error)

ForcePrimaryFailover *trusts* primary of given cluster is dead and initiates a failover

func ForcePrimaryTakeover added in v0.12.0

func ForcePrimaryTakeover(clusterName string, destination *inst.Instance) (topologyRecovery *TopologyRecovery, err error)

ForcePrimaryTakeover *trusts* primary of given cluster is dead and fails over to designated instance, which has to be its direct child.

func GracefulPrimaryTakeover added in v0.12.0

func GracefulPrimaryTakeover(clusterName string, designatedKey *inst.InstanceKey) (topologyRecovery *TopologyRecovery, err error)

GracefulPrimaryTakeover will demote primary of existing topology and promote its direct replica instead. It expects that replica to have no siblings. This function is graceful in that it will first lock down the primary, then wait for the designated replica to catch up with last position. It will point old primary at the newly promoted primary at the correct coordinates. All of this is accomplished via PlannedReparentShard operation. It is an idempotent operation, look at its documentation for more detail

func NewTopologyRecovery

func NewTopologyRecovery(replicationAnalysis inst.ReplicationAnalysis) *TopologyRecovery

func ReadActiveClusterRecovery

func ReadActiveClusterRecovery(clusterName string) ([]*TopologyRecovery, error)

ReadActiveRecoveries reads active recovery entry/audit entries from topology_recovery

func ReadActiveRecoveries

func ReadActiveRecoveries() ([]*TopologyRecovery, error)

ReadActiveRecoveries reads active recovery entry/audit entries from topology_recovery

func ReadCompletedRecoveries

func ReadCompletedRecoveries(page int) ([]*TopologyRecovery, error)

ReadCompletedRecoveries reads completed recovery entry/audit entries from topology_recovery

func ReadFailureDetection

func ReadFailureDetection(detectionID int64) ([]*TopologyRecovery, error)

ReadFailureDetection

func ReadInActivePeriodClusterRecovery

func ReadInActivePeriodClusterRecovery(clusterName string) ([]*TopologyRecovery, error)

ReadInActivePeriodClusterRecovery reads recoveries (possibly complete!) that are in active period. (may be used to block further recoveries on this cluster)

func ReadInActivePeriodSuccessorInstanceRecovery

func ReadInActivePeriodSuccessorInstanceRecovery(instanceKey *inst.InstanceKey) ([]*TopologyRecovery, error)

ReadInActivePeriodSuccessorInstanceRecovery reads completed recoveries for a given instance, where said instance was promoted as result, still in active period (may be used to block further recoveries should this instance die)

func ReadRecentFailureDetections

func ReadRecentFailureDetections(clusterAlias string, page int) ([]*TopologyRecovery, error)

ReadRecentFailureDetections

func ReadRecentRecoveries

func ReadRecentRecoveries(clusterName string, clusterAlias string, unacknowledgedOnly bool, page int) ([]*TopologyRecovery, error)

ReadCRecoveries reads latest recovery entries from topology_recovery

func ReadRecentlyActiveClusterRecovery

func ReadRecentlyActiveClusterRecovery(clusterName string) ([]*TopologyRecovery, error)

ReadRecentlyActiveClusterRecovery reads recently completed entries for a given cluster

func ReadRecentlyActiveInstanceRecovery

func ReadRecentlyActiveInstanceRecovery(instanceKey *inst.InstanceKey) ([]*TopologyRecovery, error)

ReadRecentlyActiveInstanceRecovery reads recently completed entries for a given instance

func ReadRecovery

func ReadRecovery(recoveryID int64) ([]*TopologyRecovery, error)

ReadRecovery reads completed recovery entry/audit entries from topology_recovery

func ReadRecoveryByUID

func ReadRecoveryByUID(recoveryUID string) ([]*TopologyRecovery, error)

ReadRecoveryByUID reads completed recovery entry/audit entries from topology_recovery

func (*TopologyRecovery) AddError

func (topologyRecovery *TopologyRecovery) AddError(err error) error

func (*TopologyRecovery) AddErrors

func (topologyRecovery *TopologyRecovery) AddErrors(errs []error)

type TopologyRecoveryStep

type TopologyRecoveryStep struct {
	ID          int64
	RecoveryUID string
	AuditAt     string
	Message     string
}

func NewTopologyRecoveryStep

func NewTopologyRecoveryStep(uid string, message string) *TopologyRecoveryStep

func ReadTopologyRecoverySteps

func ReadTopologyRecoverySteps(recoveryUID string) ([]TopologyRecoveryStep, error)

ReadTopologyRecoverySteps reads recovery steps for a given recovery

Jump to

Keyboard shortcuts

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