mirror of
https://github.com/zrepl/zrepl.git
synced 2025-04-15 23:18:49 +02:00
parent
6f7467e8d8
commit
26ec29d8b2
@ -71,6 +71,7 @@ type State uint
|
|||||||
|
|
||||||
const (
|
const (
|
||||||
SyncUp State = 1<<iota
|
SyncUp State = 1<<iota
|
||||||
|
SyncUpErrWait
|
||||||
Planning
|
Planning
|
||||||
Snapshotting
|
Snapshotting
|
||||||
Waiting
|
Waiting
|
||||||
@ -81,6 +82,7 @@ const (
|
|||||||
func (s State) sf() state {
|
func (s State) sf() state {
|
||||||
m := map[State]state{
|
m := map[State]state{
|
||||||
SyncUp: syncUp,
|
SyncUp: syncUp,
|
||||||
|
SyncUpErrWait: wait,
|
||||||
Planning: plan,
|
Planning: plan,
|
||||||
Snapshotting: snapshot,
|
Snapshotting: snapshot,
|
||||||
Waiting: wait,
|
Waiting: wait,
|
||||||
@ -165,7 +167,16 @@ func (s *Snapper) Run(ctx context.Context, snapshotsTaken chan<- struct{}) {
|
|||||||
func onErr(err error, u updater) state {
|
func onErr(err error, u updater) state {
|
||||||
return u(func(s *Snapper) {
|
return u(func(s *Snapper) {
|
||||||
s.err = err
|
s.err = err
|
||||||
|
preState := s.state
|
||||||
|
switch s.state {
|
||||||
|
case SyncUp:
|
||||||
|
s.state = SyncUpErrWait
|
||||||
|
case Planning:
|
||||||
|
fallthrough
|
||||||
|
case Snapshotting:
|
||||||
s.state = ErrorWait
|
s.state = ErrorWait
|
||||||
|
}
|
||||||
|
s.args.log.WithError(err).WithField("pre_state", preState).WithField("post_state", s.state).Error("snapshotting error")
|
||||||
}).sf()
|
}).sf()
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,6 +188,9 @@ func onMainCtxDone(ctx context.Context, u updater) state {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func syncUp(a args, u updater) state {
|
func syncUp(a args, u updater) state {
|
||||||
|
u(func(snapper *Snapper) {
|
||||||
|
snapper.lastInvocation = time.Now()
|
||||||
|
})
|
||||||
fss, err := listFSes(a.ctx, a.fsf)
|
fss, err := listFSes(a.ctx, a.fsf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return onErr(err, u)
|
return onErr(err, u)
|
||||||
@ -284,6 +298,12 @@ func wait(a args, u updater) state {
|
|||||||
lastTick := snapper.lastInvocation
|
lastTick := snapper.lastInvocation
|
||||||
snapper.sleepUntil = lastTick.Add(a.interval)
|
snapper.sleepUntil = lastTick.Add(a.interval)
|
||||||
sleepUntil = snapper.sleepUntil
|
sleepUntil = snapper.sleepUntil
|
||||||
|
log := a.log.WithField("sleep_until", sleepUntil).WithField("duration", a.interval)
|
||||||
|
logFunc := log.Debug
|
||||||
|
if snapper.state == ErrorWait || snapper.state == SyncUpErrWait {
|
||||||
|
logFunc = log.Error
|
||||||
|
}
|
||||||
|
logFunc("enter wait-state after error")
|
||||||
})
|
})
|
||||||
|
|
||||||
t := time.NewTimer(sleepUntil.Sub(time.Now()))
|
t := time.NewTimer(sleepUntil.Sub(time.Now()))
|
||||||
|
@ -5,15 +5,16 @@ package snapper
|
|||||||
import "strconv"
|
import "strconv"
|
||||||
|
|
||||||
const (
|
const (
|
||||||
_State_name_0 = "SyncUpPlanning"
|
_State_name_0 = "SyncUpSyncUpErrWait"
|
||||||
_State_name_1 = "Snapshotting"
|
_State_name_1 = "Planning"
|
||||||
_State_name_2 = "Waiting"
|
_State_name_2 = "Snapshotting"
|
||||||
_State_name_3 = "ErrorWait"
|
_State_name_3 = "Waiting"
|
||||||
_State_name_4 = "Stopped"
|
_State_name_4 = "ErrorWait"
|
||||||
|
_State_name_5 = "Stopped"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
_State_index_0 = [...]uint8{0, 6, 14}
|
_State_index_0 = [...]uint8{0, 6, 19}
|
||||||
)
|
)
|
||||||
|
|
||||||
func (i State) String() string {
|
func (i State) String() string {
|
||||||
@ -29,6 +30,8 @@ func (i State) String() string {
|
|||||||
return _State_name_3
|
return _State_name_3
|
||||||
case i == 32:
|
case i == 32:
|
||||||
return _State_name_4
|
return _State_name_4
|
||||||
|
case i == 64:
|
||||||
|
return _State_name_5
|
||||||
default:
|
default:
|
||||||
return "State(" + strconv.FormatInt(int64(i), 10) + ")"
|
return "State(" + strconv.FormatInt(int64(i), 10) + ")"
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user