@@ -165,6 +165,19 @@ func (s *Server) Run() (err error) {
165165 if err = utils .InitClient (s ); err != nil {
166166 return err
167167 }
168+ if err = s .initListenerAndUpdateConfig (); err != nil {
169+ return err
170+ }
171+ defer func () {
172+ if err != nil && s .serviceRegister != nil {
173+ if deregisterErr := s .serviceRegister .Deregister (); deregisterErr != nil {
174+ log .Warn ("failed to deregister the service" , errs .ZapError (deregisterErr ))
175+ }
176+ }
177+ if err != nil && s .GetListener () != nil {
178+ _ = s .GetListener ().Close ()
179+ }
180+ }()
168181
169182 if s .serviceID , s .serviceRegister , err = utils .Register (s , mcs .TSOServiceName ); err != nil {
170183 return err
@@ -347,6 +360,24 @@ func (s *Server) GetTLSConfig() *grpcutil.TLSConfig {
347360 return & s .cfg .Security .TLSConfig
348361}
349362
363+ func (s * Server ) initListenerAndUpdateConfig () error {
364+ oldListenAddr := s .cfg .ListenAddr
365+ if err := s .InitListener (s .GetTLSConfig (), s .cfg .ListenAddr ); err != nil {
366+ return err
367+ }
368+ actualListenAddr := s .GetActualListenAddr ()
369+ if actualListenAddr == "" {
370+ return nil
371+ }
372+ s .cfg .ListenAddr = server .ResolveListenAddr (s .cfg .ListenAddr , actualListenAddr )
373+ s .cfg .AdvertiseListenAddr = server .ResolveAdvertiseListenAddr (s .cfg .AdvertiseListenAddr , actualListenAddr )
374+ if s .cfg .Name == "" || s .cfg .Name == oldListenAddr {
375+ s .cfg .Name = s .cfg .AdvertiseListenAddr
376+ }
377+ s .advertiseListenHost = parseAdvertiseListenHost (s .cfg .AdvertiseListenAddr )
378+ return nil
379+ }
380+
350381func (s * Server ) startServer () (err error ) {
351382 clusterID := keypath .ClusterID ()
352383 // It may lose accuracy if use float64 to store uint64. So we store the cluster id in label.
@@ -368,10 +399,6 @@ func (s *Server) startServer() (err error) {
368399 s .tsoProtoFactory = & tsoutil.TSOProtoFactory {}
369400 s .service = & Service {Server : s }
370401
371- if err := s .InitListener (s .GetTLSConfig (), s .cfg .ListenAddr ); err != nil {
372- return err
373- }
374-
375402 serverReadyChan := make (chan struct {})
376403 defer close (serverReadyChan )
377404 s .serverLoopWg .Add (1 )
@@ -390,22 +417,7 @@ func (s *Server) startServer() (err error) {
390417
391418// CreateServer creates the Server
392419func CreateServer (ctx context.Context , cfg * Config ) * Server {
393- addr := cfg .GetAdvertiseListenAddr ()
394- parsed , err := url .Parse (addr )
395- advertiseListenHost := ""
396- if err != nil {
397- if _ , _ , splitErr := net .SplitHostPort (addr ); splitErr != nil {
398- panic (fmt .Sprintf ("invalid advertise listen address: %s" , addr ))
399- }
400- advertiseListenHost = addr
401- } else {
402- advertiseListenHost = parsed .Host
403- if advertiseListenHost == "" {
404- if _ , _ , splitErr := net .SplitHostPort (addr ); splitErr == nil {
405- advertiseListenHost = addr
406- }
407- }
408- }
420+ advertiseListenHost := parseAdvertiseListenHost (cfg .GetAdvertiseListenAddr ())
409421 svr := & Server {
410422 BaseServer : server .NewBaseServer (ctx ),
411423 DiagnosticsServer : sysutil .NewDiagnosticsServer (cfg .Log .File .Filename ),
@@ -415,6 +427,23 @@ func CreateServer(ctx context.Context, cfg *Config) *Server {
415427 return svr
416428}
417429
430+ func parseAdvertiseListenHost (addr string ) string {
431+ parsed , err := url .Parse (addr )
432+ if err != nil {
433+ if _ , _ , splitErr := net .SplitHostPort (addr ); splitErr != nil {
434+ panic (fmt .Sprintf ("invalid advertise listen address: %s" , addr ))
435+ }
436+ return addr
437+ }
438+ advertiseListenHost := parsed .Host
439+ if advertiseListenHost == "" {
440+ if _ , _ , splitErr := net .SplitHostPort (addr ); splitErr == nil {
441+ advertiseListenHost = addr
442+ }
443+ }
444+ return advertiseListenHost
445+ }
446+
418447// CreateServerWrapper encapsulates the configuration/log/metrics initialization and create the server
419448func CreateServerWrapper (cmd * cobra.Command , args []string ) {
420449 err := cmd .Flags ().Parse (args )
0 commit comments