|  | @@ -21,7 +21,6 @@ type InboundDetourHandlerDynamic struct {
 | 
	
		
			
				|  |  |  	ichInUse    []*InboundConnectionHandlerWithPort
 | 
	
		
			
				|  |  |  	ich2Recycle []*InboundConnectionHandlerWithPort
 | 
	
		
			
				|  |  |  	lastRefresh time.Time
 | 
	
		
			
				|  |  | -	started     bool
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func NewInboundDetourHandlerDynamic(space app.Space, config *InboundDetourConfig) (*InboundDetourHandlerDynamic, error) {
 | 
	
	
		
			
				|  | @@ -30,58 +29,23 @@ func NewInboundDetourHandlerDynamic(space app.Space, config *InboundDetourConfig
 | 
	
		
			
				|  |  |  		config:     config,
 | 
	
		
			
				|  |  |  		portsInUse: make(map[v2net.Port]bool),
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	if err := handler.refresh(); err != nil {
 | 
	
		
			
				|  |  | -		return nil, err
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -	return handler, nil
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -func (this *InboundDetourHandlerDynamic) refresh() error {
 | 
	
		
			
				|  |  | -	this.Lock()
 | 
	
		
			
				|  |  | -	defer this.Unlock()
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	this.ich2Recycle, this.ichInUse = this.ichInUse, this.ich2Recycle
 | 
	
		
			
				|  |  | -	if this.ich2Recycle != nil {
 | 
	
		
			
				|  |  | -		time.AfterFunc(time.Minute, func() {
 | 
	
		
			
				|  |  | -			for i := 0; i < len(this.ich2Recycle); i++ {
 | 
	
		
			
				|  |  | -				ich := this.ich2Recycle[i]
 | 
	
		
			
				|  |  | -				if ich != nil {
 | 
	
		
			
				|  |  | -					ich.handler.Close()
 | 
	
		
			
				|  |  | -					delete(this.portsInUse, ich.port)
 | 
	
		
			
				|  |  | -				}
 | 
	
		
			
				|  |  | -				this.ich2Recycle[i] = nil
 | 
	
		
			
				|  |  | -			}
 | 
	
		
			
				|  |  | -		})
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	ichCount := this.config.Allocation.Concurrency
 | 
	
		
			
				|  |  | -	// TODO: check ichCount
 | 
	
		
			
				|  |  | -	if this.ichInUse == nil {
 | 
	
		
			
				|  |  | -		this.ichInUse = make([]*InboundConnectionHandlerWithPort, ichCount)
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	for idx, _ := range this.ichInUse {
 | 
	
		
			
				|  |  | -		port := this.pickUnusedPort()
 | 
	
		
			
				|  |  | -		ich, err := proxyrepo.CreateInboundConnectionHandler(this.config.Protocol, this.space, this.config.Settings)
 | 
	
		
			
				|  |  | +	ichCount := config.Allocation.Concurrency
 | 
	
		
			
				|  |  | +	ichArray := make([]*InboundConnectionHandlerWithPort, ichCount*2)
 | 
	
		
			
				|  |  | +	for idx, _ := range ichArray {
 | 
	
		
			
				|  |  | +		//port := handler.pickUnusedPort()
 | 
	
		
			
				|  |  | +		ich, err := proxyrepo.CreateInboundConnectionHandler(config.Protocol, space, config.Settings)
 | 
	
		
			
				|  |  |  		if err != nil {
 | 
	
		
			
				|  |  |  			log.Error("Point: Failed to create inbound connection handler: ", err)
 | 
	
		
			
				|  |  | -			return err
 | 
	
		
			
				|  |  | +			return nil, err
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  | -		this.ichInUse[idx] = &InboundConnectionHandlerWithPort{
 | 
	
		
			
				|  |  | -			port:    port,
 | 
	
		
			
				|  |  | +		ichArray[idx] = &InboundConnectionHandlerWithPort{
 | 
	
		
			
				|  |  | +			port:    0,
 | 
	
		
			
				|  |  |  			handler: ich,
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	if this.started {
 | 
	
		
			
				|  |  | -		this.Start()
 | 
	
		
			
				|  |  | -	}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	this.lastRefresh = time.Now()
 | 
	
		
			
				|  |  | -	time.AfterFunc(time.Duration(this.config.Allocation.Refresh)*time.Minute, func() {
 | 
	
		
			
				|  |  | -		this.refresh()
 | 
	
		
			
				|  |  | -	})
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -	return nil
 | 
	
		
			
				|  |  | +	handler.ichInUse = ichArray[:ichCount]
 | 
	
		
			
				|  |  | +	handler.ich2Recycle = ichArray[ichCount:]
 | 
	
		
			
				|  |  | +	return handler, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (this *InboundDetourHandlerDynamic) pickUnusedPort() v2net.Port {
 | 
	
	
		
			
				|  | @@ -124,7 +88,29 @@ func (this *InboundDetourHandlerDynamic) Close() {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  func (this *InboundDetourHandlerDynamic) Start() error {
 | 
	
		
			
				|  |  | +	this.Lock()
 | 
	
		
			
				|  |  | +	defer this.Unlock()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	this.ich2Recycle, this.ichInUse = this.ichInUse, this.ich2Recycle
 | 
	
		
			
				|  |  | +	time.AfterFunc(time.Minute, func() {
 | 
	
		
			
				|  |  | +		this.Lock()
 | 
	
		
			
				|  |  | +		defer this.Unlock()
 | 
	
		
			
				|  |  | +		for _, ich := range this.ich2Recycle {
 | 
	
		
			
				|  |  | +			if ich != nil {
 | 
	
		
			
				|  |  | +				ich.handler.Close()
 | 
	
		
			
				|  |  | +				delete(this.portsInUse, ich.port)
 | 
	
		
			
				|  |  | +			}
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	this.lastRefresh = time.Now()
 | 
	
		
			
				|  |  | +	time.AfterFunc(time.Duration(this.config.Allocation.Refresh)*time.Minute, func() {
 | 
	
		
			
				|  |  | +		this.Start()
 | 
	
		
			
				|  |  | +	})
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	for _, ich := range this.ichInUse {
 | 
	
		
			
				|  |  | +		port := this.pickUnusedPort()
 | 
	
		
			
				|  |  | +		ich.port = port
 | 
	
		
			
				|  |  |  		err := retry.Timed(100 /* times */, 100 /* ms */).On(func() error {
 | 
	
		
			
				|  |  |  			err := ich.handler.Listen(ich.port)
 | 
	
		
			
				|  |  |  			if err != nil {
 | 
	
	
		
			
				|  | @@ -137,6 +123,6 @@ func (this *InboundDetourHandlerDynamic) Start() error {
 | 
	
		
			
				|  |  |  			return err
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	this.started = true
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	return nil
 | 
	
		
			
				|  |  |  }
 |