|
|
|
@ -86,16 +86,14 @@ func NewService(
|
|
|
|
|
visitorCfgs map[string]config.VisitorConf, |
|
|
|
|
cfgFile string, |
|
|
|
|
) (svr *Service, err error) { |
|
|
|
|
ctx, cancel := context.WithCancel(context.Background()) |
|
|
|
|
svr = &Service{ |
|
|
|
|
authSetter: auth.NewAuthSetter(cfg.ClientConfig), |
|
|
|
|
cfg: cfg, |
|
|
|
|
cfgFile: cfgFile, |
|
|
|
|
pxyCfgs: pxyCfgs, |
|
|
|
|
visitorCfgs: visitorCfgs, |
|
|
|
|
ctx: context.Background(), |
|
|
|
|
exit: 0, |
|
|
|
|
ctx: xlog.NewContext(ctx, xlog.New()), |
|
|
|
|
cancel: cancel, |
|
|
|
|
} |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
@ -106,7 +104,11 @@ func (svr *Service) GetController() *Control {
|
|
|
|
|
return svr.ctl |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (svr *Service) Run() error { |
|
|
|
|
func (svr *Service) Run(ctx context.Context) error { |
|
|
|
|
ctx, cancel := context.WithCancel(ctx) |
|
|
|
|
svr.ctx = xlog.NewContext(ctx, xlog.New()) |
|
|
|
|
svr.cancel = cancel |
|
|
|
|
|
|
|
|
|
xl := xlog.FromContextSafe(svr.ctx) |
|
|
|
|
|
|
|
|
|
// set custom DNSServer
|
|
|
|
@ -161,6 +163,10 @@ func (svr *Service) Run() error {
|
|
|
|
|
log.Info("admin server listen on %s:%d", svr.cfg.AdminAddr, svr.cfg.AdminPort) |
|
|
|
|
} |
|
|
|
|
<-svr.ctx.Done() |
|
|
|
|
// service context may not be canceled by svr.Close(), we should call it here to release resources
|
|
|
|
|
if atomic.LoadUint32(&svr.exit) == 0 { |
|
|
|
|
svr.Close() |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -182,7 +188,7 @@ func (svr *Service) keepControllerWorking() {
|
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// the first three retry with no delay
|
|
|
|
|
// the first three attempts with a low delay
|
|
|
|
|
if reconnectCounts > 3 { |
|
|
|
|
util.RandomSleep(reconnectDelay, 0.9, 1.1) |
|
|
|
|
xl.Info("wait %v to reconnect", reconnectDelay) |
|
|
|
@ -322,10 +328,13 @@ func (svr *Service) GracefulClose(d time.Duration) {
|
|
|
|
|
svr.ctlMu.RLock() |
|
|
|
|
if svr.ctl != nil { |
|
|
|
|
svr.ctl.GracefulClose(d) |
|
|
|
|
svr.ctl = nil |
|
|
|
|
} |
|
|
|
|
svr.ctlMu.RUnlock() |
|
|
|
|
|
|
|
|
|
svr.cancel() |
|
|
|
|
if svr.cancel != nil { |
|
|
|
|
svr.cancel() |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type ConnectionManager struct { |
|
|
|
|