|
|
@@ -87,30 +87,15 @@ func (this *InboundDetourHandlerDynamic) Close() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-func (this *InboundDetourHandlerDynamic) Start() error {
|
|
|
+func (this *InboundDetourHandlerDynamic) refresh() 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()
|
|
|
- })
|
|
|
|
|
|
+ this.ich2Recycle, this.ichInUse = this.ichInUse, this.ich2Recycle
|
|
|
for _, ich := range this.ichInUse {
|
|
|
- port := this.pickUnusedPort()
|
|
|
- ich.port = port
|
|
|
+ ich.port = this.pickUnusedPort()
|
|
|
err := retry.Timed(100 /* times */, 100 /* ms */).On(func() error {
|
|
|
err := ich.handler.Listen(ich.port)
|
|
|
if err != nil {
|
|
|
@@ -126,3 +111,26 @@ func (this *InboundDetourHandlerDynamic) Start() error {
|
|
|
|
|
|
return nil
|
|
|
}
|
|
|
+
|
|
|
+func (this *InboundDetourHandlerDynamic) Start() error {
|
|
|
+ err := this.refresh()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+
|
|
|
+ go func() {
|
|
|
+ for range time.Tick(time.Duration(this.config.Allocation.Refresh) * time.Minute) {
|
|
|
+ this.refresh()
|
|
|
+
|
|
|
+ <-time.After(time.Minute)
|
|
|
+ for _, ich := range this.ich2Recycle {
|
|
|
+ if ich != nil {
|
|
|
+ ich.handler.Close()
|
|
|
+ delete(this.portsInUse, ich.port)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }()
|
|
|
+
|
|
|
+ return nil
|
|
|
+}
|