daemon/job: track active side state explicitly

This commit is contained in:
Christian Schwarz 2018-10-21 12:38:38 +02:00
parent 5efeec1819
commit f704b28cad
2 changed files with 93 additions and 0 deletions

View File

@ -38,10 +38,29 @@ type ActiveSide struct {
tasks activeSideTasks
}
//go:generate enumer -type=ActiveSideState
type ActiveSideState int
const (
ActiveSideReplicating ActiveSideState = 1 << iota
ActiveSidePruneSender
ActiveSidePruneReceiver
ActiveSideDone // also errors
)
type activeSideTasks struct {
state ActiveSideState
// valid for state ActiveSideReplicating, ActiveSidePruneSender, ActiveSidePruneReceiver, ActiveSideDone
replication *replication.Replication
replicationCancel context.CancelFunc
// valid for state ActiveSidePruneSender, ActiveSidePruneReceiver, ActiveSideDone
prunerSender, prunerReceiver *pruner.Pruner
// valid for state ActiveSidePruneReceiver, ActiveSideDone
prunerSenderCancel, prunerReceiverCancel context.CancelFunc
}
@ -337,6 +356,7 @@ func (j *ActiveSide) do(ctx context.Context) {
*tasks = activeSideTasks{}
tasks.replicationCancel = repCancel
tasks.replication = replication.NewReplication(j.promRepStateSecs, j.promBytesReplicated)
tasks.state = ActiveSideReplicating
})
log.Info("start replication")
tasks.replication.Drive(ctx, sender, receiver)
@ -353,6 +373,7 @@ func (j *ActiveSide) do(ctx context.Context) {
tasks := j.updateTasks(func(tasks *activeSideTasks) {
tasks.prunerSender = j.prunerFactory.BuildSenderPruner(ctx, sender, sender)
tasks.prunerSenderCancel = senderCancel
tasks.state = ActiveSidePruneSender
})
log.Info("start pruning sender")
tasks.prunerSender.Prune()
@ -369,10 +390,16 @@ func (j *ActiveSide) do(ctx context.Context) {
tasks := j.updateTasks(func(tasks *activeSideTasks) {
tasks.prunerReceiver = j.prunerFactory.BuildReceiverPruner(ctx, receiver, sender)
tasks.prunerReceiverCancel = receiverCancel
tasks.state = ActiveSidePruneReceiver
})
log.Info("start pruning receiver")
tasks.prunerReceiver.Prune()
log.Info("finished pruning receiver")
receiverCancel()
}
j.updateTasks(func(tasks *activeSideTasks) {
tasks.state = ActiveSideDone
})
}

View File

@ -0,0 +1,66 @@
// Code generated by "enumer -type=ActiveSideState"; DO NOT EDIT.
package job
import (
"fmt"
)
const (
_ActiveSideStateName_0 = "ActiveSideReplicatingActiveSidePruneSender"
_ActiveSideStateName_1 = "ActiveSidePruneReceiver"
_ActiveSideStateName_2 = "ActiveSideDone"
)
var (
_ActiveSideStateIndex_0 = [...]uint8{0, 21, 42}
_ActiveSideStateIndex_1 = [...]uint8{0, 23}
_ActiveSideStateIndex_2 = [...]uint8{0, 14}
)
func (i ActiveSideState) String() string {
switch {
case 1 <= i && i <= 2:
i -= 1
return _ActiveSideStateName_0[_ActiveSideStateIndex_0[i]:_ActiveSideStateIndex_0[i+1]]
case i == 4:
return _ActiveSideStateName_1
case i == 8:
return _ActiveSideStateName_2
default:
return fmt.Sprintf("ActiveSideState(%d)", i)
}
}
var _ActiveSideStateValues = []ActiveSideState{1, 2, 4, 8}
var _ActiveSideStateNameToValueMap = map[string]ActiveSideState{
_ActiveSideStateName_0[0:21]: 1,
_ActiveSideStateName_0[21:42]: 2,
_ActiveSideStateName_1[0:23]: 4,
_ActiveSideStateName_2[0:14]: 8,
}
// ActiveSideStateString retrieves an enum value from the enum constants string name.
// Throws an error if the param is not part of the enum.
func ActiveSideStateString(s string) (ActiveSideState, error) {
if val, ok := _ActiveSideStateNameToValueMap[s]; ok {
return val, nil
}
return 0, fmt.Errorf("%s does not belong to ActiveSideState values", s)
}
// ActiveSideStateValues returns all values of the enum
func ActiveSideStateValues() []ActiveSideState {
return _ActiveSideStateValues
}
// IsAActiveSideState returns "true" if the value is listed in the enum definition. "false" otherwise
func (i ActiveSideState) IsAActiveSideState() bool {
for _, v := range _ActiveSideStateValues {
if i == v {
return true
}
}
return false
}