remove EndpointPair abstraction

This commit is contained in:
Christian Schwarz 2018-08-21 22:15:00 +02:00
parent 38532abf45
commit 2f205d205b
4 changed files with 24 additions and 70 deletions

View File

@ -43,49 +43,3 @@ func NewFilteredError(fs string) *FilteredError {
} }
func (f FilteredError) Error() string { return "endpoint does not allow access to filesystem " + f.fs } func (f FilteredError) Error() string { return "endpoint does not allow access to filesystem " + f.fs }
type ReplicationMode int
const (
ReplicationModePull ReplicationMode = iota
ReplicationModePush
)
type EndpointPair struct {
a, b ReplicationEndpoint
m ReplicationMode
}
func NewEndpointPairPull(sender, receiver ReplicationEndpoint) EndpointPair {
return EndpointPair{sender, receiver, ReplicationModePull}
}
func NewEndpointPairPush(sender, receiver ReplicationEndpoint) EndpointPair {
return EndpointPair{receiver, sender, ReplicationModePush}
}
func (p EndpointPair) Sender() ReplicationEndpoint {
switch p.m {
case ReplicationModePull:
return p.a
case ReplicationModePush:
return p.b
}
panic("should not be reached")
return nil
}
func (p EndpointPair) Receiver() ReplicationEndpoint {
switch p.m {
case ReplicationModePull:
return p.b
case ReplicationModePush:
return p.a
}
panic("should not be reached")
return nil
}
func (p EndpointPair) Mode() ReplicationMode {
return p.m
}

View File

@ -135,7 +135,7 @@ type FSReplicationStep struct {
err error err error
} }
func (f *FSReplication) TakeStep(ctx context.Context, ep EndpointPair) (post FSReplicationState, nextStepDate time.Time) { func (f *FSReplication) TakeStep(ctx context.Context, sender, receiver ReplicationEndpoint) (post FSReplicationState, nextStepDate time.Time) {
var u fsrUpdater = func(fu func(*FSReplication)) FSReplicationState { var u fsrUpdater = func(fu func(*FSReplication)) FSReplicationState {
f.lock.Lock() f.lock.Lock()
@ -149,7 +149,7 @@ func (f *FSReplication) TakeStep(ctx context.Context, ep EndpointPair) (post FSR
pre := u(nil) pre := u(nil)
preTime := time.Now() preTime := time.Now()
s = s(ctx, ep, u) s = s(ctx, sender, receiver, u)
delta := time.Now().Sub(preTime) delta := time.Now().Sub(preTime)
post = u(func(f *FSReplication) { post = u(func(f *FSReplication) {
if len(f.pending) == 0 { if len(f.pending) == 0 {
@ -169,9 +169,9 @@ func (f *FSReplication) TakeStep(ctx context.Context, ep EndpointPair) (post FSR
type fsrUpdater func(func(fsr *FSReplication)) FSReplicationState type fsrUpdater func(func(fsr *FSReplication)) FSReplicationState
type fsrsf func(ctx context.Context, ep EndpointPair, u fsrUpdater) fsrsf type fsrsf func(ctx context.Context, sender, receiver ReplicationEndpoint, u fsrUpdater) fsrsf
func fsrsfReady(ctx context.Context, ep EndpointPair, u fsrUpdater) fsrsf { func fsrsfReady(ctx context.Context, sender, receiver ReplicationEndpoint, u fsrUpdater) fsrsf {
var current *FSReplicationStep var current *FSReplicationStep
s := u(func(f *FSReplication) { s := u(func(f *FSReplication) {
@ -185,7 +185,7 @@ func fsrsfReady(ctx context.Context, ep EndpointPair, u fsrUpdater) fsrsf {
return s.fsrsf() return s.fsrsf()
} }
stepState := current.do(ctx, ep) stepState := current.do(ctx, sender, receiver)
return u(func(f *FSReplication) { return u(func(f *FSReplication) {
switch stepState { switch stepState {
@ -209,7 +209,7 @@ func fsrsfReady(ctx context.Context, ep EndpointPair, u fsrUpdater) fsrsf {
}).fsrsf() }).fsrsf()
} }
func fsrsfRetryWait(ctx context.Context, ep EndpointPair, u fsrUpdater) fsrsf { func fsrsfRetryWait(ctx context.Context, sender, receiver ReplicationEndpoint, u fsrUpdater) fsrsf {
var sleepUntil time.Time var sleepUntil time.Time
u(func(f *FSReplication) { u(func(f *FSReplication) {
sleepUntil = f.retryWaitUntil sleepUntil = f.retryWaitUntil
@ -255,7 +255,7 @@ func (fsr *FSReplication) Report() *FilesystemReplicationReport {
return &rep return &rep
} }
func (s *FSReplicationStep) do(ctx context.Context, ep EndpointPair) FSReplicationStepState { func (s *FSReplicationStep) do(ctx context.Context, sender, receiver ReplicationEndpoint) FSReplicationStepState {
fs := s.fsrep.fs fs := s.fsrep.fs
@ -308,7 +308,7 @@ func (s *FSReplicationStep) do(ctx context.Context, ep EndpointPair) FSReplicati
} }
log.WithField("request", sr).Debug("initiate send request") log.WithField("request", sr).Debug("initiate send request")
sres, sstream, err := ep.Sender().Send(ctx, sr) sres, sstream, err := sender.Send(ctx, sr)
if err != nil { if err != nil {
log.WithError(err).Error("send request failed") log.WithError(err).Error("send request failed")
return updateStateError(err) return updateStateError(err)
@ -323,7 +323,7 @@ func (s *FSReplicationStep) do(ctx context.Context, ep EndpointPair) FSReplicati
ClearResumeToken: !sres.UsedResumeToken, ClearResumeToken: !sres.UsedResumeToken,
} }
log.WithField("request", rr).Debug("initiate receive request") log.WithField("request", rr).Debug("initiate receive request")
err = ep.Receiver().Receive(ctx, rr, sstream) err = receiver.Receive(ctx, rr, sstream)
if err != nil { if err != nil {
log.WithError(err).Error("receive request failed (might also be error on sender)") log.WithError(err).Error("receive request failed (might also be error on sender)")
sstream.Close() sstream.Close()

View File

@ -80,9 +80,9 @@ func NewReplication() *Replication {
} }
type replicationUpdater func(func(*Replication)) (newState ReplicationState) type replicationUpdater func(func(*Replication)) (newState ReplicationState)
type replicationStateFunc func(context.Context, EndpointPair, replicationUpdater) replicationStateFunc type replicationStateFunc func(ctx context.Context, sender, receiver ReplicationEndpoint, u replicationUpdater) replicationStateFunc
func (r *Replication) Drive(ctx context.Context, ep EndpointPair) { func (r *Replication) Drive(ctx context.Context, sender, receiver ReplicationEndpoint) {
var u replicationUpdater = func(f func(*Replication)) ReplicationState { var u replicationUpdater = func(f func(*Replication)) ReplicationState {
r.lock.Lock() r.lock.Lock()
@ -98,7 +98,7 @@ func (r *Replication) Drive(ctx context.Context, ep EndpointPair) {
for s != nil { for s != nil {
preTime := time.Now() preTime := time.Now()
pre = u(nil) pre = u(nil)
s = s(ctx, ep, u) s = s(ctx, sender, receiver, u)
delta := time.Now().Sub(preTime) delta := time.Now().Sub(preTime)
post = u(nil) post = u(nil)
GetLogger(ctx). GetLogger(ctx).
@ -133,7 +133,7 @@ func resolveConflict(conflict error) (path []*pdu.FilesystemVersion, msg string)
return nil, "no automated way to handle conflict type" return nil, "no automated way to handle conflict type"
} }
func rsfPlanning(ctx context.Context, ep EndpointPair, u replicationUpdater) replicationStateFunc { func rsfPlanning(ctx context.Context, sender, receiver ReplicationEndpoint, u replicationUpdater) replicationStateFunc {
log := GetLogger(ctx) log := GetLogger(ctx)
@ -144,13 +144,13 @@ func rsfPlanning(ctx context.Context, ep EndpointPair, u replicationUpdater) rep
}).rsf() }).rsf()
} }
sfss, err := ep.Sender().ListFilesystems(ctx) sfss, err := sender.ListFilesystems(ctx)
if err != nil { if err != nil {
log.WithError(err).Error("error listing sender filesystems") log.WithError(err).Error("error listing sender filesystems")
return handlePlanningError(err) return handlePlanningError(err)
} }
rfss, err := ep.Receiver().ListFilesystems(ctx) rfss, err := receiver.ListFilesystems(ctx)
if err != nil { if err != nil {
log.WithError(err).Error("error listing receiver filesystems") log.WithError(err).Error("error listing receiver filesystems")
return handlePlanningError(err) return handlePlanningError(err)
@ -164,7 +164,7 @@ func rsfPlanning(ctx context.Context, ep EndpointPair, u replicationUpdater) rep
log.Info("assessing filesystem") log.Info("assessing filesystem")
sfsvs, err := ep.Sender().ListFilesystemVersions(ctx, fs.Path) sfsvs, err := sender.ListFilesystemVersions(ctx, fs.Path)
if err != nil { if err != nil {
log.WithError(err).Error("cannot get remote filesystem versions") log.WithError(err).Error("cannot get remote filesystem versions")
return handlePlanningError(err) return handlePlanningError(err)
@ -186,7 +186,7 @@ func rsfPlanning(ctx context.Context, ep EndpointPair, u replicationUpdater) rep
var rfsvs []*pdu.FilesystemVersion var rfsvs []*pdu.FilesystemVersion
if receiverFSExists { if receiverFSExists {
rfsvs, err = ep.Receiver().ListFilesystemVersions(ctx, fs.Path) rfsvs, err = receiver.ListFilesystemVersions(ctx, fs.Path)
if err != nil { if err != nil {
if _, ok := err.(*FilteredError); ok { if _, ok := err.(*FilteredError); ok {
log.Info("receiver ignores filesystem") log.Info("receiver ignores filesystem")
@ -236,7 +236,7 @@ func rsfPlanning(ctx context.Context, ep EndpointPair, u replicationUpdater) rep
}).rsf() }).rsf()
} }
func rsfPlanningError(ctx context.Context, ep EndpointPair, u replicationUpdater) replicationStateFunc { func rsfPlanningError(ctx context.Context, sender, receiver ReplicationEndpoint, u replicationUpdater) replicationStateFunc {
sleepTime := 10 * time.Second sleepTime := 10 * time.Second
u(func(r *Replication) { u(func(r *Replication) {
r.sleepUntil = time.Now().Add(sleepTime) r.sleepUntil = time.Now().Add(sleepTime)
@ -256,7 +256,7 @@ func rsfPlanningError(ctx context.Context, ep EndpointPair, u replicationUpdater
} }
} }
func rsfWorking(ctx context.Context, ep EndpointPair, u replicationUpdater) replicationStateFunc { func rsfWorking(ctx context.Context, sender, receiver ReplicationEndpoint, u replicationUpdater) replicationStateFunc {
var active *ReplicationQueueItemHandle var active *ReplicationQueueItemHandle
rsfNext := u(func(r *Replication) { rsfNext := u(func(r *Replication) {
@ -273,7 +273,7 @@ func rsfWorking(ctx context.Context, ep EndpointPair, u replicationUpdater) repl
return rsfNext return rsfNext
} }
state, nextStepDate := active.GetFSReplication().TakeStep(ctx, ep) state, nextStepDate := active.GetFSReplication().TakeStep(ctx, sender, receiver)
return u(func(r *Replication) { return u(func(r *Replication) {
active.Update(state, nextStepDate) active.Update(state, nextStepDate)
@ -281,7 +281,7 @@ func rsfWorking(ctx context.Context, ep EndpointPair, u replicationUpdater) repl
}).rsf() }).rsf()
} }
func rsfWorkingWait(ctx context.Context, ep EndpointPair, u replicationUpdater) replicationStateFunc { func rsfWorkingWait(ctx context.Context, sender, receiver ReplicationEndpoint, u replicationUpdater) replicationStateFunc {
sleepTime := 10 * time.Second sleepTime := 10 * time.Second
u(func(r *Replication) { u(func(r *Replication) {
r.sleepUntil = time.Now().Add(sleepTime) r.sleepUntil = time.Now().Add(sleepTime)
@ -327,14 +327,14 @@ func (r *Replication) Report() *Report {
active = r.active.GetFSReplication() active = r.active.GetFSReplication()
rep.Active = active.Report() rep.Active = active.Report()
} }
r.queue.Foreach(func (h *ReplicationQueueItemHandle){ r.queue.Foreach(func(h *ReplicationQueueItemHandle) {
fsr := h.GetFSReplication() fsr := h.GetFSReplication()
if active != fsr { if active != fsr {
rep.Pending = append(rep.Pending, fsr.Report()) rep.Pending = append(rep.Pending, fsr.Report())
} }
}) })
for _, fsr := range r.completed { for _, fsr := range r.completed {
rep.Completed = append(rep.Completed, fsr.Report()) rep.Completed = append(rep.Completed, fsr.Report())
} }
return &rep return &rep

View File

@ -10,7 +10,7 @@ import (
type Report = mainfsm.Report type Report = mainfsm.Report
type Replication interface { type Replication interface {
Drive(ctx context.Context, ep common.EndpointPair) Drive(ctx context.Context, sender, receiver common.ReplicationEndpoint)
Report() *Report Report() *Report
} }