diff --git a/shell/point/inbound_detour_dynamic.go b/shell/point/inbound_detour_dynamic.go index fe3beb9b7..e3282d1db 100644 --- a/shell/point/inbound_detour_dynamic.go +++ b/shell/point/inbound_detour_dynamic.go @@ -18,8 +18,8 @@ type InboundDetourHandlerDynamic struct { space app.Space config *InboundDetourConfig portsInUse map[v2net.Port]bool - ichInUse []*InboundConnectionHandlerWithPort - ich2Recycle []*InboundConnectionHandlerWithPort + ichInUse []proxy.InboundHandler + ich2Recycle []proxy.InboundHandler lastRefresh time.Time } @@ -30,18 +30,14 @@ func NewInboundDetourHandlerDynamic(space app.Space, config *InboundDetourConfig portsInUse: make(map[v2net.Port]bool), } ichCount := config.Allocation.Concurrency - ichArray := make([]*InboundConnectionHandlerWithPort, ichCount*2) + ichArray := make([]proxy.InboundHandler, ichCount*2) for idx, _ := range ichArray { - //port := handler.pickUnusedPort() ich, err := proxyrepo.CreateInboundHandler(config.Protocol, space, config.Settings) if err != nil { log.Error("Point: Failed to create inbound connection handler: ", err) return nil, err } - ichArray[idx] = &InboundConnectionHandlerWithPort{ - port: 0, - handler: ich, - } + ichArray[idx] = ich } handler.ichInUse = ichArray[:ichCount] handler.ich2Recycle = ichArray[ichCount:] @@ -69,19 +65,19 @@ func (this *InboundDetourHandlerDynamic) GetConnectionHandler() (proxy.InboundHa if until < 0 { until = 0 } - return ich.handler, int(until) + return ich, int(until) } func (this *InboundDetourHandlerDynamic) Close() { this.Lock() defer this.Unlock() for _, ich := range this.ichInUse { - ich.handler.Close() + ich.Close() } if this.ich2Recycle != nil { for _, ich := range this.ich2Recycle { - if ich != nil && ich.handler != nil { - ich.handler.Close() + if ich != nil { + ich.Close() } } } @@ -95,13 +91,13 @@ func (this *InboundDetourHandlerDynamic) refresh() error { this.ich2Recycle, this.ichInUse = this.ichInUse, this.ich2Recycle for _, ich := range this.ichInUse { - delete(this.portsInUse, ich.port) - ich.handler.Close() - ich.port = this.pickUnusedPort() + delete(this.portsInUse, ich.Port()) + ich.Close() + port := this.pickUnusedPort() err := retry.Timed(100 /* times */, 100 /* ms */).On(func() error { - err := ich.handler.Listen(ich.port) + err := ich.Listen(port) if err != nil { - log.Error("Point: Failed to start inbound detour on port ", ich.port, ": ", err) + log.Error("Point: Failed to start inbound detour on port ", port, ": ", err) return err } return nil