doc: add info for dh mode

This commit is contained in:
nadoo 2018-08-26 01:43:28 +08:00
parent 035e15df5c
commit 2f239d60f1
5 changed files with 12 additions and 7 deletions

View File

@ -2,5 +2,6 @@ language: go
go:
- "1.10.x"
- "1.11.x"
- master

View File

@ -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

View File

@ -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")

View File

@ -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

View File

@ -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))]
}