failover

package
v1.5.0 Latest Latest
Warning

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

Go to latest
Published: Aug 27, 2019 License: MIT Imports: 25 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var HealthCheckResponse_Status_name = map[int32]string{
	0: "UNKNOWN",
	1: "HEALTHY",
	2: "UNHEALTHY",
}
View Source
var HealthCheckResponse_Status_value = map[string]int32{
	"UNKNOWN":   0,
	"HEALTHY":   1,
	"UNHEALTHY": 2,
}

Functions

func HealthCheckToString

func HealthCheckToString(healthcheck HealthCheckResponse) string

HealthCheckToString renders a healthcheck to a human-readable string

func NewClientCtx

func NewClientCtx(ctx context.Context, token string, timeout time.Duration) (context.Context, func())

NewClientCtx generates a new context that will authenticate against the pauser API

func NewLock added in v1.5.0

func NewLock(client *clientv3.Client, clusterdataKey string) locker

NewLock returns a locker that is expected to provide exclusive access to the clusterdata resource. Any application trying to modify clusterdata- such as a config management system applying clusterdata configuration- should acquire this lock before making changes.

func Pipeline

func Pipeline(steps ...*pipelineStep) func(context.Context, context.Context) error

Pipeline can be used to construct a step-by-step process with deferred actions. By handling the errors and control-flow, it can provide an expressive mechanism for specifying pipelines.

func RegisterFailoverServer

func RegisterFailoverServer(s *grpc.Server, srv FailoverServer)

func Step

func Step(action func(context.Context) error) *pipelineStep

Types

type Empty

type Empty struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (*Empty) Descriptor

func (*Empty) Descriptor() ([]byte, []int)

func (*Empty) ProtoMessage

func (*Empty) ProtoMessage()

func (*Empty) Reset

func (m *Empty) Reset()

func (*Empty) String

func (m *Empty) String() string

func (*Empty) XXX_DiscardUnknown

func (m *Empty) XXX_DiscardUnknown()

func (*Empty) XXX_Marshal

func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*Empty) XXX_Merge

func (m *Empty) XXX_Merge(src proto.Message)

func (*Empty) XXX_Size

func (m *Empty) XXX_Size() int

func (*Empty) XXX_Unmarshal

func (m *Empty) XXX_Unmarshal(b []byte) error

type Failover

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

func NewFailover

func NewFailover(logger kitlog.Logger, client *clientv3.Client, clients map[string]FailoverClient, stolonctl stolon.Stolonctl, opt FailoverOptions) *Failover

func (*Failover) AcquireLock

func (f *Failover) AcquireLock(ctx context.Context) error

func (*Failover) CheckClusterHealthy

func (f *Failover) CheckClusterHealthy(ctx context.Context) error

func (*Failover) EachClient

func (f *Failover) EachClient(logger kitlog.Logger, action func(string, FailoverClient) error) (result error)

EachClient provides a helper to perform actions on all the failover clients, in parallel. For some operations where there is a penalty for extended running time (such as pause) it's important that each request occurs in parallel.

func (*Failover) Failkeeper

func (f *Failover) Failkeeper(ctx context.Context) error

Failkeeper uses stolonctl to mark the current primary keeper as failed

func (*Failover) HealthCheckClients

func (f *Failover) HealthCheckClients(ctx context.Context) error

func (*Failover) NotifyRecovered

func (f *Failover) NotifyRecovered(ctx context.Context, logger kitlog.Logger, oldMaster stolon.DB) chan stolon.DB

NotifyRecovered will return a channel that receives the new master DB only once it is healthy and available for writes. We determine this by checking the new master and all its sync nodes are healthy.

func (*Failover) Pause

func (f *Failover) Pause(ctx context.Context) error

func (*Failover) ReleaseLock

func (f *Failover) ReleaseLock(ctx context.Context) error

func (*Failover) RestoreSleepInterval added in v1.5.0

func (f *Failover) RestoreSleepInterval(ctx context.Context) error

RestoreSleepInterval removes the temporary short sleep interval that we apply for the purpose of fast failover.

func (*Failover) Resume

func (f *Failover) Resume(ctx context.Context) error

func (*Failover) Run

func (f *Failover) Run(ctx context.Context, deferCtx context.Context) error

Run triggers the failover process. We model this as a Pipeline of steps, where each step has associated deferred actions that must be scheduled before the primary operation ever takes place.

This has the benefit of clearly expressing the steps required to perform a failover, tidying up some of the error handling and logging noise that would otherwise be present.

func (*Failover) ShortenSleepInterval added in v1.5.0

func (f *Failover) ShortenSleepInterval(ctx context.Context) error

ShortenSleepInterval temporarily applies a shorter sleep interval that can help stolon components respond quicker to the failover. We cache the original interval to ensure we can return the cluster to how it was prior to the failover.

type FailoverClient

type FailoverClient interface {
	HealthCheck(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*HealthCheckResponse, error)
	Pause(ctx context.Context, in *PauseRequest, opts ...grpc.CallOption) (*PauseResponse, error)
	Resume(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ResumeResponse, error)
}

FailoverClient is the client API for Failover service.

For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.

func NewFailoverClient

func NewFailoverClient(cc *grpc.ClientConn) FailoverClient

type FailoverOptions

type FailoverOptions struct {
	ClusterdataKey     string
	Token              string
	HealthCheckTimeout time.Duration
	LockTimeout        time.Duration
	PauseTimeout       time.Duration
	PauseExpiry        time.Duration
	ResumeTimeout      time.Duration
	StolonctlTimeout   time.Duration
}

type FailoverServer

type FailoverServer interface {
	HealthCheck(context.Context, *Empty) (*HealthCheckResponse, error)
	Pause(context.Context, *PauseRequest) (*PauseResponse, error)
	Resume(context.Context, *Empty) (*ResumeResponse, error)
}

FailoverServer is the server API for Failover service.

type HealthCheckResponse

type HealthCheckResponse struct {
	Status               HealthCheckResponse_Status                  `protobuf:"varint,1,opt,name=status,proto3,enum=failover.HealthCheckResponse_Status" json:"status,omitempty"`
	Components           []*HealthCheckResponse_ComponentHealthCheck `protobuf:"bytes,2,rep,name=components,proto3" json:"components,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                    `json:"-"`
	XXX_unrecognized     []byte                                      `json:"-"`
	XXX_sizecache        int32                                       `json:"-"`
}

func (*HealthCheckResponse) Descriptor

func (*HealthCheckResponse) Descriptor() ([]byte, []int)

func (*HealthCheckResponse) GetComponents

func (*HealthCheckResponse) GetStatus

func (*HealthCheckResponse) ProtoMessage

func (*HealthCheckResponse) ProtoMessage()

func (*HealthCheckResponse) Reset

func (m *HealthCheckResponse) Reset()

func (*HealthCheckResponse) String

func (m *HealthCheckResponse) String() string

func (*HealthCheckResponse) XXX_DiscardUnknown

func (m *HealthCheckResponse) XXX_DiscardUnknown()

func (*HealthCheckResponse) XXX_Marshal

func (m *HealthCheckResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*HealthCheckResponse) XXX_Merge

func (m *HealthCheckResponse) XXX_Merge(src proto.Message)

func (*HealthCheckResponse) XXX_Size

func (m *HealthCheckResponse) XXX_Size() int

func (*HealthCheckResponse) XXX_Unmarshal

func (m *HealthCheckResponse) XXX_Unmarshal(b []byte) error

type HealthCheckResponse_ComponentHealthCheck

type HealthCheckResponse_ComponentHealthCheck struct {
	Status               HealthCheckResponse_Status `protobuf:"varint,1,opt,name=status,proto3,enum=failover.HealthCheckResponse_Status" json:"status,omitempty"`
	Name                 string                     `protobuf:"bytes,2,opt,name=Name,proto3" json:"Name,omitempty"`
	Error                string                     `protobuf:"bytes,3,opt,name=Error,proto3" json:"Error,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                   `json:"-"`
	XXX_unrecognized     []byte                     `json:"-"`
	XXX_sizecache        int32                      `json:"-"`
}

func (*HealthCheckResponse_ComponentHealthCheck) Descriptor

func (*HealthCheckResponse_ComponentHealthCheck) Descriptor() ([]byte, []int)

func (*HealthCheckResponse_ComponentHealthCheck) GetError

func (*HealthCheckResponse_ComponentHealthCheck) GetName

func (*HealthCheckResponse_ComponentHealthCheck) GetStatus

func (*HealthCheckResponse_ComponentHealthCheck) ProtoMessage

func (*HealthCheckResponse_ComponentHealthCheck) Reset

func (*HealthCheckResponse_ComponentHealthCheck) String

func (*HealthCheckResponse_ComponentHealthCheck) XXX_DiscardUnknown

func (m *HealthCheckResponse_ComponentHealthCheck) XXX_DiscardUnknown()

func (*HealthCheckResponse_ComponentHealthCheck) XXX_Marshal

func (m *HealthCheckResponse_ComponentHealthCheck) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*HealthCheckResponse_ComponentHealthCheck) XXX_Merge

func (*HealthCheckResponse_ComponentHealthCheck) XXX_Size

func (*HealthCheckResponse_ComponentHealthCheck) XXX_Unmarshal

func (m *HealthCheckResponse_ComponentHealthCheck) XXX_Unmarshal(b []byte) error

type HealthCheckResponse_Status

type HealthCheckResponse_Status int32
const (
	HealthCheckResponse_UNKNOWN   HealthCheckResponse_Status = 0
	HealthCheckResponse_HEALTHY   HealthCheckResponse_Status = 1
	HealthCheckResponse_UNHEALTHY HealthCheckResponse_Status = 2
)

func (HealthCheckResponse_Status) EnumDescriptor

func (HealthCheckResponse_Status) EnumDescriptor() ([]byte, []int)

func (HealthCheckResponse_Status) String

type PauseRequest

type PauseRequest struct {
	Timeout              int64    `protobuf:"varint,1,opt,name=timeout,proto3" json:"timeout,omitempty"`
	Expiry               int64    `protobuf:"varint,2,opt,name=expiry,proto3" json:"expiry,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (*PauseRequest) Descriptor

func (*PauseRequest) Descriptor() ([]byte, []int)

func (*PauseRequest) GetExpiry

func (m *PauseRequest) GetExpiry() int64

func (*PauseRequest) GetTimeout

func (m *PauseRequest) GetTimeout() int64

func (*PauseRequest) ProtoMessage

func (*PauseRequest) ProtoMessage()

func (*PauseRequest) Reset

func (m *PauseRequest) Reset()

func (*PauseRequest) String

func (m *PauseRequest) String() string

func (*PauseRequest) XXX_DiscardUnknown

func (m *PauseRequest) XXX_DiscardUnknown()

func (*PauseRequest) XXX_Marshal

func (m *PauseRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*PauseRequest) XXX_Merge

func (m *PauseRequest) XXX_Merge(src proto.Message)

func (*PauseRequest) XXX_Size

func (m *PauseRequest) XXX_Size() int

func (*PauseRequest) XXX_Unmarshal

func (m *PauseRequest) XXX_Unmarshal(b []byte) error

type PauseResponse

type PauseResponse struct {
	CreatedAt            *timestamp.Timestamp `protobuf:"bytes,1,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
	ExpiresAt            *timestamp.Timestamp `protobuf:"bytes,2,opt,name=expires_at,json=expiresAt,proto3" json:"expires_at,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (*PauseResponse) Descriptor

func (*PauseResponse) Descriptor() ([]byte, []int)

func (*PauseResponse) GetCreatedAt

func (m *PauseResponse) GetCreatedAt() *timestamp.Timestamp

func (*PauseResponse) GetExpiresAt

func (m *PauseResponse) GetExpiresAt() *timestamp.Timestamp

func (*PauseResponse) ProtoMessage

func (*PauseResponse) ProtoMessage()

func (*PauseResponse) Reset

func (m *PauseResponse) Reset()

func (*PauseResponse) String

func (m *PauseResponse) String() string

func (*PauseResponse) XXX_DiscardUnknown

func (m *PauseResponse) XXX_DiscardUnknown()

func (*PauseResponse) XXX_Marshal

func (m *PauseResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*PauseResponse) XXX_Merge

func (m *PauseResponse) XXX_Merge(src proto.Message)

func (*PauseResponse) XXX_Size

func (m *PauseResponse) XXX_Size() int

func (*PauseResponse) XXX_Unmarshal

func (m *PauseResponse) XXX_Unmarshal(b []byte) error

type ResumeResponse

type ResumeResponse struct {
	CreatedAt            *timestamp.Timestamp `protobuf:"bytes,1,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"`
	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
	XXX_unrecognized     []byte               `json:"-"`
	XXX_sizecache        int32                `json:"-"`
}

func (*ResumeResponse) Descriptor

func (*ResumeResponse) Descriptor() ([]byte, []int)

func (*ResumeResponse) GetCreatedAt

func (m *ResumeResponse) GetCreatedAt() *timestamp.Timestamp

func (*ResumeResponse) ProtoMessage

func (*ResumeResponse) ProtoMessage()

func (*ResumeResponse) Reset

func (m *ResumeResponse) Reset()

func (*ResumeResponse) String

func (m *ResumeResponse) String() string

func (*ResumeResponse) XXX_DiscardUnknown

func (m *ResumeResponse) XXX_DiscardUnknown()

func (*ResumeResponse) XXX_Marshal

func (m *ResumeResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error)

func (*ResumeResponse) XXX_Merge

func (m *ResumeResponse) XXX_Merge(src proto.Message)

func (*ResumeResponse) XXX_Size

func (m *ResumeResponse) XXX_Size() int

func (*ResumeResponse) XXX_Unmarshal

func (m *ResumeResponse) XXX_Unmarshal(b []byte) error

type Server

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

Server implements the hooks required to provide the failover interface

func NewServer

func NewServer(logger kitlog.Logger, bouncer *pgbouncer.PgBouncer) *Server

func (*Server) HealthCheck

func (s *Server) HealthCheck(ctx context.Context, _ *Empty) (*HealthCheckResponse, error)

func (*Server) LoggingInterceptor

func (s *Server) LoggingInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error)

LoggingInterceptor returns a UnaryServerInterceptor that logs all incoming requests, both at the start and at the end of their execution.

func (*Server) NewAuthenticationInterceptor

func (s *Server) NewAuthenticationInterceptor(token string) func(context.Context, interface{}, *grpc.UnaryServerInfo, grpc.UnaryHandler) (interface{}, error)

NewAuthenticationInterceptor returns a UnaryServerInterceptor that validates the context token before accepting any requests.

func (*Server) Pause

func (s *Server) Pause(ctx context.Context, req *PauseRequest) (resp *PauseResponse, err error)

func (*Server) Resume

func (s *Server) Resume(ctx context.Context, _ *Empty) (*ResumeResponse, error)

type UnimplementedFailoverServer

type UnimplementedFailoverServer struct {
}

UnimplementedFailoverServer can be embedded to have forward compatible implementations.

func (*UnimplementedFailoverServer) HealthCheck

func (*UnimplementedFailoverServer) Pause

func (*UnimplementedFailoverServer) Resume

Jump to

Keyboard shortcuts

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