From e7f18216c878c6527e7f3a6c9652f860f60bcc0d Mon Sep 17 00:00:00 2001 From: mantaohuang Date: Fri, 17 Apr 2020 23:27:16 -0400 Subject: [PATCH] add fallback load balance mode --- go-socks-lb/manager.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/go-socks-lb/manager.go b/go-socks-lb/manager.go index 069d1e7..5f1f434 100644 --- a/go-socks-lb/manager.go +++ b/go-socks-lb/manager.go @@ -18,6 +18,7 @@ import ( const ( cachedShuffle = "cached-shuffle" sticky = "sticky" + fallback = "fallback" ) type queueMapElement struct { @@ -71,7 +72,7 @@ func (qm *queueMap) SetTrim(key string, value int, maxLength int) { qm.Set(key, value) qm.Trim(maxLength) } -func (qm *queueMap) Filter(f func(int) int) { +func (qm *queueMap) MapFilter(f func(int) int) { e := qm.l.Front() for e != nil { key := e.Value.(string) @@ -185,7 +186,7 @@ func (pm *ProxyManager) applyWeight() { return -1 } } - pm.Cache.Filter(filterFn) + pm.Cache.MapFilter(filterFn) } func (pm *ProxyManager) Get(addr string) (string, bool) { pm.mux.Lock() @@ -210,6 +211,16 @@ func (pm *ProxyManager) Get(addr string) (string, bool) { } pm.Cache.SetTrim(addr, idx, pm.CacheMaxLength) return pm.Proxys[pm.enabledIndics[idx]].URL, true + } else if pm.LoadBalanceMode == fallback { + addr := "*" + idx, ok := pm.Cache.Get(addr) + if ok { + idx = (idx + 1) % (len(pm.enabledIndics)) + } else { + idx = pm.Chooser.Pick().(int) + } + pm.Cache.SetTrim(addr, idx, pm.CacheMaxLength) + return pm.Proxys[pm.enabledIndics[idx]].URL, true } else { idx := pm.Chooser.Pick().(int) return pm.Proxys[pm.enabledIndics[idx]].URL, true