mirror of
https://github.com/zrepl/zrepl.git
synced 2025-06-06 09:56:40 +02:00
active side: track activities in Run() as atomically updated member
This commit is contained in:
parent
9e941d5be5
commit
75ba5874a5
@ -30,8 +30,28 @@ type ActiveSide struct {
|
|||||||
promPruneSecs *prometheus.HistogramVec // labels: prune_side
|
promPruneSecs *prometheus.HistogramVec // labels: prune_side
|
||||||
promBytesReplicated *prometheus.CounterVec // labels: filesystem
|
promBytesReplicated *prometheus.CounterVec // labels: filesystem
|
||||||
|
|
||||||
mtx sync.Mutex
|
tasksMtx sync.Mutex
|
||||||
|
tasks activeSideTasks
|
||||||
|
}
|
||||||
|
|
||||||
|
type activeSideTasks struct {
|
||||||
replication *replication.Replication
|
replication *replication.Replication
|
||||||
|
prunerSender, prunerReceiver *pruner.Pruner
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *ActiveSide) updateTasks(u func(*activeSideTasks)) activeSideTasks {
|
||||||
|
a.tasksMtx.Lock()
|
||||||
|
var copy activeSideTasks
|
||||||
|
copy = a.tasks
|
||||||
|
a.tasksMtx.Unlock()
|
||||||
|
if u == nil {
|
||||||
|
return copy
|
||||||
|
}
|
||||||
|
u(©)
|
||||||
|
a.tasksMtx.Lock()
|
||||||
|
a.tasks = copy
|
||||||
|
a.tasksMtx.Unlock()
|
||||||
|
return copy
|
||||||
}
|
}
|
||||||
|
|
||||||
type activeMode interface {
|
type activeMode interface {
|
||||||
@ -176,20 +196,14 @@ type ActiveSideStatus struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (j *ActiveSide) Status() *Status {
|
func (j *ActiveSide) Status() *Status {
|
||||||
rep := func() *replication.Replication {
|
tasks := j.updateTasks(nil)
|
||||||
j.mtx.Lock()
|
|
||||||
defer j.mtx.Unlock()
|
|
||||||
if j.replication == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
return j.replication
|
|
||||||
}()
|
|
||||||
s := &ActiveSideStatus{}
|
s := &ActiveSideStatus{}
|
||||||
t := j.mode.Type()
|
t := j.mode.Type()
|
||||||
if rep == nil {
|
if tasks.replication == nil {
|
||||||
return &Status{Type: t, JobSpecific: s}
|
return &Status{Type: t, JobSpecific: s}
|
||||||
}
|
}
|
||||||
s.Replication = rep.Report()
|
s.Replication = tasks.replication.Report()
|
||||||
return &Status{Type: t, JobSpecific: s}
|
return &Status{Type: t, JobSpecific: s}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -235,19 +249,21 @@ func (j *ActiveSide) do(ctx context.Context) {
|
|||||||
|
|
||||||
sender, receiver, err := j.mode.SenderReceiver(client)
|
sender, receiver, err := j.mode.SenderReceiver(client)
|
||||||
|
|
||||||
j.mtx.Lock()
|
tasks := j.updateTasks(func(tasks *activeSideTasks) {
|
||||||
j.replication = replication.NewReplication(j.promRepStateSecs, j.promBytesReplicated)
|
// reset it
|
||||||
j.mtx.Unlock()
|
*tasks = activeSideTasks{}
|
||||||
|
tasks.replication = replication.NewReplication(j.promRepStateSecs, j.promBytesReplicated)
|
||||||
|
})
|
||||||
|
|
||||||
log.Info("start replication")
|
log.Info("start replication")
|
||||||
j.replication.Drive(ctx, sender, receiver)
|
tasks.replication.Drive(ctx, sender, receiver)
|
||||||
|
|
||||||
|
tasks = j.updateTasks(func(tasks *activeSideTasks) {
|
||||||
|
tasks.prunerSender = j.prunerFactory.BuildSenderPruner(ctx, sender, sender)
|
||||||
|
tasks.prunerReceiver = j.prunerFactory.BuildReceiverPruner(ctx, receiver, sender)
|
||||||
|
})
|
||||||
log.Info("start pruning sender")
|
log.Info("start pruning sender")
|
||||||
senderPruner := j.prunerFactory.BuildSenderPruner(ctx, sender, sender)
|
tasks.prunerSender.Prune()
|
||||||
senderPruner.Prune()
|
|
||||||
|
|
||||||
log.Info("start pruning receiver")
|
log.Info("start pruning receiver")
|
||||||
receiverPruner := j.prunerFactory.BuildReceiverPruner(ctx, receiver, sender)
|
tasks.prunerReceiver.Prune()
|
||||||
receiverPruner.Prune()
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user