Adding AEConfig and some methods to scale timing
This commit is contained in:
parent
e3159d0318
commit
177a91c3f9
|
@ -11,12 +11,18 @@ import (
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Config is the configuration that can be set for an Agent.
|
// Config is the configuration that can be set for an Agent.
|
||||||
// Some of this is configurable as CLI flags, but most must
|
// Some of this is configurable as CLI flags, but most must
|
||||||
// be set using a configuration file.
|
// be set using a configuration file.
|
||||||
type Config struct {
|
type Config struct {
|
||||||
|
// AEInterval controls the anti-entropy interval. This is how often
|
||||||
|
// the agent attempts to reconcile it's local state with the server'
|
||||||
|
// representation of our state. Defaults to every 60s.
|
||||||
|
AEInterval time.Duration
|
||||||
|
|
||||||
// Bootstrap is used to bring up the first Consul server, and
|
// Bootstrap is used to bring up the first Consul server, and
|
||||||
// permits that node to elect itself leader
|
// permits that node to elect itself leader
|
||||||
Bootstrap bool
|
Bootstrap bool
|
||||||
|
@ -96,6 +102,7 @@ type dirEnts []os.FileInfo
|
||||||
// DefaultConfig is used to return a sane default configuration
|
// DefaultConfig is used to return a sane default configuration
|
||||||
func DefaultConfig() *Config {
|
func DefaultConfig() *Config {
|
||||||
return &Config{
|
return &Config{
|
||||||
|
AEInterval: time.Minute,
|
||||||
Datacenter: consul.DefaultDC,
|
Datacenter: consul.DefaultDC,
|
||||||
DNSAddr: "127.0.0.1:8600",
|
DNSAddr: "127.0.0.1:8600",
|
||||||
Domain: "consul.",
|
Domain: "consul.",
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
package agent
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// This scale factor means we will add a minute after we
|
||||||
|
// cross 128 nodes, another at 256, another at 512, etc.
|
||||||
|
// By 8192 nodes, we will scale up by a factor of 8
|
||||||
|
aeScaleThreshold = 128
|
||||||
|
)
|
||||||
|
|
||||||
|
// aeScale is used to scale the time interval at which anti-entropy
|
||||||
|
// take place. It is used to prevent saturation as the cluster size grows
|
||||||
|
func aeScale(interval time.Duration, n int) time.Duration {
|
||||||
|
// Don't scale until we cross the threshold
|
||||||
|
if n <= aeScaleThreshold {
|
||||||
|
return interval
|
||||||
|
}
|
||||||
|
|
||||||
|
multiplier := math.Ceil(math.Log2(float64(n))-math.Log2(aeScaleThreshold)) + 1.0
|
||||||
|
return time.Duration(multiplier) * interval
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package agent
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestAEScale(t *testing.T) {
|
||||||
|
intv := time.Minute
|
||||||
|
if v := aeScale(intv, 100); v != intv {
|
||||||
|
t.Fatalf("Bad: %v", v)
|
||||||
|
}
|
||||||
|
if v := aeScale(intv, 200); v != 2*intv {
|
||||||
|
t.Fatalf("Bad: %v", v)
|
||||||
|
}
|
||||||
|
if v := aeScale(intv, 1000); v != 4*intv {
|
||||||
|
t.Fatalf("Bad: %v", v)
|
||||||
|
}
|
||||||
|
if v := aeScale(intv, 10000); v != 8*intv {
|
||||||
|
t.Fatalf("Bad: %v", v)
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue