client: add StatusExporter in service (#4182)

This commit is contained in:
fatedier 2024-04-25 20:20:39 +08:00 committed by GitHub
parent c1893ee1b4
commit 405969085f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 25 additions and 10 deletions

View File

@ -380,18 +380,31 @@ func (svr *Service) stop() {
} }
} }
// TODO(fatedier): Use StatusExporter to provide query interfaces instead of directly using methods from the Service. func (svr *Service) getProxyStatus(name string) (*proxy.WorkingStatus, bool) {
func (svr *Service) GetProxyStatus(name string) (*proxy.WorkingStatus, error) {
svr.ctlMu.RLock() svr.ctlMu.RLock()
ctl := svr.ctl ctl := svr.ctl
svr.ctlMu.RUnlock() svr.ctlMu.RUnlock()
if ctl == nil { if ctl == nil {
return nil, fmt.Errorf("control is not running") return nil, false
} }
ws, ok := ctl.pm.GetProxyStatus(name) return ctl.pm.GetProxyStatus(name)
if !ok { }
return nil, fmt.Errorf("proxy [%s] is not found", name)
} func (svr *Service) StatusExporter() StatusExporter {
return ws, nil return &statusExporterImpl{
getProxyStatusFunc: svr.getProxyStatus,
}
}
type StatusExporter interface {
GetProxyStatus(name string) (*proxy.WorkingStatus, bool)
}
type statusExporterImpl struct {
getProxyStatusFunc func(name string) (*proxy.WorkingStatus, bool)
}
func (s *statusExporterImpl) GetProxyStatus(name string) (*proxy.WorkingStatus, bool) {
return s.getProxyStatusFunc(name)
} }

View File

@ -363,11 +363,13 @@ func (s *TunnelServer) waitProxyStatusReady(name string, timeout time.Duration)
timer := time.NewTimer(timeout) timer := time.NewTimer(timeout)
defer timer.Stop() defer timer.Stop()
statusExporter := s.vc.Service().StatusExporter()
for { for {
select { select {
case <-ticker.C: case <-ticker.C:
ps, err := s.vc.Service().GetProxyStatus(name) ps, ok := statusExporter.GetProxyStatus(name)
if err != nil { if !ok {
continue continue
} }
switch ps.Phase { switch ps.Phase {