diff --git a/lib/gat/handlers/pool/critics/replication/critic.go b/lib/gat/handlers/pool/critics/replication/critic.go index 4b6fd58e2058b1d6efdd858d144551307d3fcf5b..3484cec1d020ed06e6d38515b87575150eb8b6af 100644 --- a/lib/gat/handlers/pool/critics/replication/critic.go +++ b/lib/gat/handlers/pool/critics/replication/critic.go @@ -13,9 +13,20 @@ func init() { caddy.RegisterModule((*Critic)(nil)) } +// Critic describes a replication critic which measures replication lag, +// with a fallback to query latency when there is no *measurable* lag type Critic struct { - Threshold caddy.Duration `json:"threshold"` - Validity caddy.Duration `json:"validity"` + QueryThreshold caddy.Duration `json:"query_threshold"` + ReplicationThreshold caddy.Duration `json:"replication_threshold"` + Validity caddy.Duration `json:"validity"` +} + +func NewCritic() *Critic { + return &Critic{ + QueryThreshold: caddy.Duration(time.Millisecond * 300), + ReplicationThreshold: caddy.Duration(time.Second * 3), + Validity: caddy.Duration(time.Minute * 5), + } } func (T *Critic) CaddyModule() caddy.ModuleInfo { @@ -44,11 +55,11 @@ func (T *Critic) Taste(ctx context.Context, conn *fed.Conn) (int, time.Duration, penalty := 0 - if result.Lag != nil { - penalty = int(*result.Lag / time.Duration(T.Threshold).Seconds()) + if (result.Lag != nil) && (*result.Lag > 0) { + penalty = int(*result.Lag / time.Duration(T.ReplicationThreshold).Seconds()) } else { dur := time.Since(start) - penalty = int(dur / time.Duration(T.Threshold)) + penalty = int(dur / time.Duration(T.QueryThreshold)) } return penalty, time.Duration(T.Validity), nil