This commit is contained in:
ginuerzh
2021-11-16 16:12:16 +08:00
parent 2c0ce35b0b
commit 83dacf67d5
15 changed files with 543 additions and 266 deletions

View File

@ -1,7 +1,7 @@
package chain
import (
"sync"
"sync/atomic"
"time"
"github.com/go-gost/gost/pkg/bypass"
@ -86,8 +86,7 @@ func (g *NodeGroup) Next() *Node {
type FailMarker struct {
failTime int64
failCount uint32
mux sync.RWMutex
failCount int64
}
func (m *FailMarker) FailTime() int64 {
@ -95,21 +94,15 @@ func (m *FailMarker) FailTime() int64 {
return 0
}
m.mux.RLock()
defer m.mux.RUnlock()
return m.failTime
return atomic.LoadInt64(&m.failCount)
}
func (m *FailMarker) FailCount() uint32 {
func (m *FailMarker) FailCount() int64 {
if m == nil {
return 0
}
m.mux.RLock()
defer m.mux.RUnlock()
return m.failCount
return atomic.LoadInt64(&m.failCount)
}
func (m *FailMarker) Mark() {
@ -117,11 +110,8 @@ func (m *FailMarker) Mark() {
return
}
m.mux.Lock()
defer m.mux.Unlock()
m.failTime = time.Now().Unix()
m.failCount++
atomic.AddInt64(&m.failCount, 1)
atomic.StoreInt64(&m.failTime, time.Now().Unix())
}
func (m *FailMarker) Reset() {
@ -129,9 +119,5 @@ func (m *FailMarker) Reset() {
return
}
m.mux.Lock()
defer m.mux.Unlock()
m.failTime = 0
m.failCount = 0
atomic.StoreInt64(&m.failCount, 0)
}

View File

@ -11,7 +11,6 @@ import (
// default options for FailFilter
const (
DefaultMaxFails = 1
DefaultFailTimeout = 30 * time.Second
)
@ -128,20 +127,17 @@ func FailFilter(maxFails int, timeout time.Duration) Filter {
// Filter filters dead nodes.
func (f *failFilter) Filter(nodes ...*Node) []*Node {
maxFails := f.maxFails
if maxFails == 0 {
maxFails = DefaultMaxFails
}
failTimeout := f.failTimeout
if failTimeout == 0 {
failTimeout = DefaultFailTimeout
}
if len(nodes) <= 1 || maxFails < 0 {
if len(nodes) <= 1 || maxFails <= 0 {
return nodes
}
var nl []*Node
for _, node := range nodes {
if node.Marker().FailCount() < uint32(maxFails) ||
if node.Marker().FailCount() < int64(maxFails) ||
time.Since(time.Unix(node.Marker().FailTime(), 0)) >= failTimeout {
nl = append(nl, node)
}