Add validation interval
This commit is contained in:
33
s3/s3.go
33
s3/s3.go
@@ -82,6 +82,9 @@ type Replica struct {
|
||||
// Time between retention checks.
|
||||
RetentionCheckInterval time.Duration
|
||||
|
||||
// Time between validation checks.
|
||||
ValidationInterval time.Duration
|
||||
|
||||
// If true, replica monitors database for changes automatically.
|
||||
// Set to false if replica is being used synchronously (such as in tests).
|
||||
MonitorEnabled bool
|
||||
@@ -128,6 +131,11 @@ func (r *Replica) Type() string {
|
||||
return "s3"
|
||||
}
|
||||
|
||||
// DB returns the parent database reference.
|
||||
func (r *Replica) DB() *litestream.DB {
|
||||
return r.db
|
||||
}
|
||||
|
||||
// LastPos returns the last successfully replicated position.
|
||||
func (r *Replica) LastPos() litestream.Pos {
|
||||
r.mu.RLock()
|
||||
@@ -410,9 +418,10 @@ func (r *Replica) Start(ctx context.Context) {
|
||||
ctx, r.cancel = context.WithCancel(ctx)
|
||||
|
||||
// Start goroutines to manage replica data.
|
||||
r.wg.Add(2)
|
||||
r.wg.Add(3)
|
||||
go func() { defer r.wg.Done(); r.monitor(ctx) }()
|
||||
go func() { defer r.wg.Done(); r.retainer(ctx) }()
|
||||
go func() { defer r.wg.Done(); r.validator(ctx) }()
|
||||
}
|
||||
|
||||
// Stop cancels any outstanding replication and blocks until finished.
|
||||
@@ -477,6 +486,28 @@ func (r *Replica) retainer(ctx context.Context) {
|
||||
}
|
||||
}
|
||||
|
||||
// validator runs in a separate goroutine and handles periodic validation.
|
||||
func (r *Replica) validator(ctx context.Context) {
|
||||
if r.ValidationInterval <= 0 {
|
||||
return
|
||||
}
|
||||
|
||||
ticker := time.NewTicker(r.ValidationInterval)
|
||||
defer ticker.Stop()
|
||||
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case <-ticker.C:
|
||||
if err := litestream.ValidateReplica(ctx, r); err != nil {
|
||||
log.Printf("%s(%s): validation error: %s", r.db.Path(), r.Name(), err)
|
||||
continue
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// CalcPos returns the position for the replica for the current generation.
|
||||
// Returns a zero value if there is no active generation.
|
||||
func (r *Replica) CalcPos(ctx context.Context, generation string) (pos litestream.Pos, err error) {
|
||||
|
||||
Reference in New Issue
Block a user