@@ -140,35 +140,33 @@ func (c *innerClient) setServiceMode(newMode pdpb.ServiceMode) {
140140 c .Lock ()
141141 defer c .Unlock ()
142142
143- if c .option .UseTSOServerProxy {
144- // If we are using TSO server proxy, we always use PD_SVC_MODE.
145- newMode = pdpb .ServiceMode_PD_SVC_MODE
146- }
147143 if newMode == c .serviceMode {
148144 return
149145 }
150- log .Info ("[pd] changing TSO provider" ,
151- zap .String ("old" , convertToString (c .serviceMode )),
152- zap .String ("new" , convertToString (newMode )))
153- c .resetTSOClientLocked (newMode )
154- oldMode := c .serviceMode
155- c .serviceMode = newMode
156- log .Info ("[pd] TSO provider changed" ,
157- zap .String ("old" , convertToString (oldMode )),
158- zap .String ("new" , convertToString (newMode )))
159- }
160146
161- func convertToString (mode pdpb.ServiceMode ) string {
162- switch mode {
147+ switch newMode {
148+ case pdpb .ServiceMode_UNKNOWN_SVC_MODE :
149+ log .Warn ("[pd] intend to switch to unknown service mode, use PD_SVC_MODE" )
150+ fallthrough
163151 case pdpb .ServiceMode_PD_SVC_MODE :
164- return "pd"
152+ if c .tsoSvcDiscovery != nil || c .tsoClient == nil {
153+ c .resetTSOClientLocked (newMode )
154+ }
155+ if c .resourceManagerDiscovery != nil {
156+ c .resetResourceManagerDiscoveryLocked (newMode )
157+ }
165158 case pdpb .ServiceMode_API_SVC_MODE :
166- return "tso server"
167- case pdpb .ServiceMode_UNKNOWN_SVC_MODE :
168- return "unknown"
169- default :
170- return "invalid"
159+ // If we are using TSO server proxy, we always use PD_SVC_MODE.
160+ if c .tsoSvcDiscovery == nil && ! c .option .UseTSOServerProxy {
161+ c .resetTSOClientLocked (newMode )
162+ }
163+ if c .resourceManagerDiscovery == nil && ! c .option .UseResourceManagerProxy {
164+ c .resetResourceManagerDiscoveryLocked (newMode )
165+ }
171166 }
167+
168+ c .serviceMode = newMode
169+ log .Info ("[pd] service mode changed" , zap .String ("new-mode" , newMode .String ()))
172170}
173171
174172// Reset a new TSO client.
@@ -182,6 +180,7 @@ func (c *innerClient) resetTSOClientLocked(mode pdpb.ServiceMode) {
182180 case pdpb .ServiceMode_PD_SVC_MODE :
183181 newTSOCli = tso .NewClient (c .ctx , c .option ,
184182 c .serviceDiscovery , & tso.PDStreamBuilderFactory {})
183+ log .Info ("[pd] tso provider changed to pd" )
185184 case pdpb .ServiceMode_API_SVC_MODE :
186185 newTSOSvcDiscovery = sd .NewTSOServiceDiscovery (
187186 c .ctx , c , c .serviceDiscovery ,
@@ -196,6 +195,7 @@ func (c *innerClient) resetTSOClientLocked(mode pdpb.ServiceMode) {
196195 zap .Error (err ))
197196 return
198197 }
198+ log .Info ("[pd] tso provider changed to tso server" )
199199 case pdpb .ServiceMode_UNKNOWN_SVC_MODE :
200200 log .Warn ("[pd] intend to switch to unknown service mode, just return" )
201201 return
@@ -217,6 +217,38 @@ func (c *innerClient) resetTSOClientLocked(mode pdpb.ServiceMode) {
217217 }
218218}
219219
220+ func (c * innerClient ) resetResourceManagerDiscoveryLocked (newMode pdpb.ServiceMode ) {
221+ var newResourceManagerDiscovery * sd.ResourceManagerDiscovery
222+ if newMode == pdpb .ServiceMode_API_SVC_MODE && ! c .option .UseResourceManagerProxy {
223+ newResourceManagerDiscovery = sd .NewResourceManagerDiscovery (
224+ c .ctx , c .serviceDiscovery .GetClusterID (), c , c .tlsCfg , c .option , c .scheduleUpdateTokenConnection )
225+ if err := newResourceManagerDiscovery .Init (); err != nil {
226+ log .Error ("[pd] failed to initialize resource manager discovery. keep the current service mode" ,
227+ zap .Strings ("svr-urls" , c .svrUrls ),
228+ zap .String ("current-mode" , c .serviceMode .String ()),
229+ zap .Error (err ))
230+ newResourceManagerDiscovery .Close ()
231+ return
232+ }
233+ }
234+ if c .resourceManagerDiscovery != nil {
235+ c .resourceManagerDiscovery .Close ()
236+ }
237+ c .resourceManagerDiscovery = newResourceManagerDiscovery
238+ if newMode == pdpb .ServiceMode_PD_SVC_MODE {
239+ log .Info ("[pd] resource manager provider changed to pd" )
240+ } else {
241+ log .Info ("[pd] resource manager provider changed to resource manager server" )
242+ }
243+ _ = c .scheduleUpdateTokenConnection ("" )
244+ }
245+
246+ func (c * innerClient ) getResourceManagerDiscovery () * sd.ResourceManagerDiscovery {
247+ c .RLock ()
248+ defer c .RUnlock ()
249+ return c .resourceManagerDiscovery
250+ }
251+
220252func (c * innerClient ) scheduleUpdateTokenConnection (string ) error {
221253 select {
222254 case c .updateTokenConnectionCh <- struct {}{}:
@@ -225,10 +257,20 @@ func (c *innerClient) scheduleUpdateTokenConnection(string) error {
225257 return nil
226258}
227259
228- func (c * innerClient ) getServiceMode () pdpb.ServiceMode {
260+ type tsoProvider int
261+
262+ const (
263+ tsoProviderPD tsoProvider = iota
264+ tsoProviderTSOServer
265+ )
266+
267+ func (c * innerClient ) getTSOProvider () tsoProvider {
229268 c .RLock ()
230269 defer c .RUnlock ()
231- return c .serviceMode
270+ if c .tsoSvcDiscovery != nil {
271+ return tsoProviderTSOServer
272+ }
273+ return tsoProviderPD
232274}
233275
234276func (c * innerClient ) getTSOClient () * tso.Cli {
0 commit comments