From 2f239d60f1e9974a7d9fdf66893119e34e82faa9 Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Sun, 26 Aug 2018 01:43:28 +0800 Subject: [PATCH] doc: add info for dh mode --- .travis.yml | 1 + README.md | 1 + conf.go | 1 + config/glider.conf.example | 1 + strategy/strategy.go | 15 ++++++++------- 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 23defe8..937b6ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,5 +2,6 @@ language: go go: - "1.10.x" + - "1.11.x" - master diff --git a/README.md b/README.md index dfa264d..ceee7e5 100644 --- a/README.md +++ b/README.md @@ -217,6 +217,7 @@ Available forward strategies: rr: Round Robin mode ha: High Availability mode lha: Latency based High Availability mode + dh: destination hashing mode Forwarder option scheme: FORWARD_URL#OPTIONS priority: set the priority of that forwarder, default:0 diff --git a/conf.go b/conf.go index a92c87a..b2c32f1 100644 --- a/conf.go +++ b/conf.go @@ -190,6 +190,7 @@ func usage() { fmt.Fprintf(os.Stderr, " rr: Round Robin mode\n") fmt.Fprintf(os.Stderr, " ha: High Availability mode\n") fmt.Fprintf(os.Stderr, " lha: Latency based High Availability mode\n") + fmt.Fprintf(os.Stderr, " dh: destination hashing mode\n") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintf(os.Stderr, "Forwarder option scheme: FORWARD_URL#OPTIONS\n") diff --git a/config/glider.conf.example b/config/glider.conf.example index 3b2fcec..ae20836 100644 --- a/config/glider.conf.example +++ b/config/glider.conf.example @@ -105,6 +105,7 @@ listen=socks5://:1080 # Round Robin mode: rr # High Availability mode: ha # Latency based High Availability mode: lha +# Destination Hashing mode: dh strategy=rr diff --git a/strategy/strategy.go b/strategy/strategy.go index 3d7e6d9..177e378 100644 --- a/strategy/strategy.go +++ b/strategy/strategy.go @@ -105,7 +105,7 @@ func newDialer(fwdrs []*proxy.Forwarder, c *Config) *Dialer { } for _, f := range fwdrs { - f.AddHandler(d.OnStatusChanged) + f.AddHandler(d.onStatusChanged) } return d @@ -128,6 +128,7 @@ func (d *Dialer) DialUDP(network, addr string) (pc net.PacketConn, writeTo net.A func (d *Dialer) NextDialer(dstAddr string) proxy.Dialer { d.mu.RLock() defer d.mu.RUnlock() + return d.nextForwarder(dstAddr) } @@ -158,12 +159,13 @@ func (d *Dialer) initAvailable() { } } -// OnStatusChanged will be called when fwdr's status changed -func (d *Dialer) OnStatusChanged(fwdr *proxy.Forwarder) { +// onStatusChanged will be called when fwdr's status changed +func (d *Dialer) onStatusChanged(fwdr *proxy.Forwarder) { d.mu.Lock() defer d.mu.Unlock() if fwdr.Enabled() { + log.F("[strategy] %s changed from Disabled to Enabled ", fwdr.Addr()) if fwdr.Priority() == d.Priority() { d.available = append(d.available, fwdr) } else if fwdr.Priority() > d.Priority() { @@ -172,6 +174,7 @@ func (d *Dialer) OnStatusChanged(fwdr *proxy.Forwarder) { } if !fwdr.Enabled() { + log.F("[strategy] %s changed from Enabled to Disabled", fwdr.Addr()) for i, f := range d.available { if f == fwdr { d.available[i], d.available = d.available[len(d.available)-1], d.available[:len(d.available)-1] @@ -239,8 +242,7 @@ func (d *Dialer) check(i int) { } func (d *Dialer) scheduleRR(dstAddr string) *proxy.Forwarder { - idx := atomic.AddUint32(&d.index, 1) % uint32(len(d.available)) - return d.available[idx] + return d.available[atomic.AddUint32(&d.index, 1)%uint32(len(d.available))] } func (d *Dialer) scheduleHA(dstAddr string) *proxy.Forwarder { @@ -263,6 +265,5 @@ func (d *Dialer) scheduleLHA(dstAddr string) *proxy.Forwarder { func (d *Dialer) scheduleDH(dstAddr string) *proxy.Forwarder { fnv1a := fnv.New32a() fnv1a.Write([]byte(dstAddr)) - idx := fnv1a.Sum32() % uint32(len(d.available)) - return d.available[idx] + return d.available[fnv1a.Sum32()%uint32(len(d.available))] }