From 81bf7b985abe03960ccef23d10ef6449d4a5277c Mon Sep 17 00:00:00 2001 From: ginuerzh Date: Wed, 24 Aug 2022 23:12:20 +0800 Subject: [PATCH] improve chain node bypass --- chain/chain.go | 11 ++++++----- chain/node.go | 20 ++++++++++++++++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/chain/chain.go b/chain/chain.go index 1183110..58f77cc 100644 --- a/chain/chain.go +++ b/chain/chain.go @@ -29,14 +29,15 @@ func (c *Chain) Route(network, address string) (r *Route) { chain: c, } for _, group := range c.groups { - node := group.Next() - if node == nil { - return - } - if node.Bypass != nil && node.Bypass.Contains(address) { + // hop level bypass test + if group.bypass != nil && group.bypass.Contains(address) { break } + node := group.filter(address).Next() + if node == nil { + return + } if node.Transport.Multiplex() { tr := node.Transport.Copy(). WithRoute(r) diff --git a/chain/node.go b/chain/node.go index bd4cfcd..a615f9b 100644 --- a/chain/node.go +++ b/chain/node.go @@ -28,6 +28,7 @@ func (node *Node) Copy() *Node { type NodeGroup struct { nodes []*Node selector Selector + bypass bypass.Bypass } func NewNodeGroup(nodes ...*Node) *NodeGroup { @@ -45,6 +46,25 @@ func (g *NodeGroup) WithSelector(selector Selector) *NodeGroup { return g } +func (g *NodeGroup) WithBypass(bypass bypass.Bypass) *NodeGroup { + g.bypass = bypass + return g +} + +func (g *NodeGroup) filter(addr string) *NodeGroup { + var nodes []*Node + for _, node := range g.nodes { + if node.Bypass == nil || !node.Bypass.Contains(addr) { + nodes = append(nodes, node) + } + } + return &NodeGroup{ + nodes: nodes, + selector: g.selector, + bypass: g.bypass, + } +} + func (g *NodeGroup) Next() *Node { if g == nil || len(g.nodes) == 0 { return nil