@@ -152,6 +152,16 @@ func NewClient(target string, opts ...DialOption) (conn *ClientConn, err error)
152152 for _ , opt := range opts {
153153 opt .apply (& cc .dopts )
154154 }
155+
156+ // Determine the resolver to use.
157+ if err := cc .initParsedTargetAndResolverBuilder (); err != nil {
158+ return nil , err
159+ }
160+
161+ for _ , opt := range globalPerTargetDialOptions {
162+ opt .DialOptionForTarget (cc .parsedTarget .URL ).apply (& cc .dopts )
163+ }
164+
155165 chainUnaryClientInterceptors (cc )
156166 chainStreamClientInterceptors (cc )
157167
@@ -168,25 +178,16 @@ func NewClient(target string, opts ...DialOption) (conn *ClientConn, err error)
168178 }
169179 cc .mkp = cc .dopts .copts .KeepaliveParams
170180
171- // Register ClientConn with channelz.
172- cc .channelzRegistration (target )
173-
174- // TODO: Ideally it should be impossible to error from this function after
175- // channelz registration. This will require removing some channelz logs
176- // from the following functions that can error. Errors can be returned to
177- // the user, and successful logs can be emitted here, after the checks have
178- // passed and channelz is subsequently registered.
179-
180- // Determine the resolver to use.
181- if err := cc .parseTargetAndFindResolver (); err != nil {
182- channelz .RemoveEntry (cc .channelz .ID )
183- return nil , err
184- }
185- if err = cc .determineAuthority (); err != nil {
186- channelz .RemoveEntry (cc .channelz .ID )
181+ if err = cc .initAuthority (); err != nil {
187182 return nil , err
188183 }
189184
185+ // Register ClientConn with channelz. Note that this is only done after
186+ // channel creation cannot fail.
187+ cc .channelzRegistration (target )
188+ channelz .Infof (logger , cc .channelz , "parsed dial target is: %#v" , cc .parsedTarget )
189+ channelz .Infof (logger , cc .channelz , "Channel authority set to %q" , cc .authority )
190+
190191 cc .csMgr = newConnectivityStateManager (cc .ctx , cc .channelz )
191192 cc .pickerWrapper = newPickerWrapper (cc .dopts .copts .StatsHandlers )
192193
@@ -587,11 +588,11 @@ type ClientConn struct {
587588
588589 // The following are initialized at dial time, and are read-only after that.
589590 target string // User's dial target.
590- parsedTarget resolver.Target // See parseTargetAndFindResolver ().
591- authority string // See determineAuthority ().
591+ parsedTarget resolver.Target // See initParsedTargetAndResolverBuilder ().
592+ authority string // See initAuthority ().
592593 dopts dialOptions // Default and user specified dial options.
593594 channelz * channelz.Channel // Channelz object.
594- resolverBuilder resolver.Builder // See parseTargetAndFindResolver ().
595+ resolverBuilder resolver.Builder // See initParsedTargetAndResolverBuilder ().
595596 idlenessMgr * idle.Manager
596597
597598 // The following provide their own synchronization, and therefore don't
@@ -1673,22 +1674,19 @@ func (cc *ClientConn) connectionError() error {
16731674 return cc .lastConnectionError
16741675}
16751676
1676- // parseTargetAndFindResolver parses the user's dial target and stores the
1677- // parsed target in `cc.parsedTarget`.
1677+ // initParsedTargetAndResolverBuilder parses the user's dial target and stores
1678+ // the parsed target in `cc.parsedTarget`.
16781679//
16791680// The resolver to use is determined based on the scheme in the parsed target
16801681// and the same is stored in `cc.resolverBuilder`.
16811682//
16821683// Doesn't grab cc.mu as this method is expected to be called only at Dial time.
1683- func (cc * ClientConn ) parseTargetAndFindResolver () error {
1684- channelz .Infof (logger , cc . channelz , "original dial target is: %q" , cc .target )
1684+ func (cc * ClientConn ) initParsedTargetAndResolverBuilder () error {
1685+ logger .Infof ("original dial target is: %q" , cc .target )
16851686
16861687 var rb resolver.Builder
16871688 parsedTarget , err := parseTarget (cc .target )
1688- if err != nil {
1689- channelz .Infof (logger , cc .channelz , "dial target %q parse failed: %v" , cc .target , err )
1690- } else {
1691- channelz .Infof (logger , cc .channelz , "parsed dial target is: %#v" , parsedTarget )
1689+ if err == nil {
16921690 rb = cc .getResolver (parsedTarget .URL .Scheme )
16931691 if rb != nil {
16941692 cc .parsedTarget = parsedTarget
@@ -1707,15 +1705,12 @@ func (cc *ClientConn) parseTargetAndFindResolver() error {
17071705 defScheme = resolver .GetDefaultScheme ()
17081706 }
17091707
1710- channelz .Infof (logger , cc .channelz , "fallback to scheme %q" , defScheme )
17111708 canonicalTarget := defScheme + ":///" + cc .target
17121709
17131710 parsedTarget , err = parseTarget (canonicalTarget )
17141711 if err != nil {
1715- channelz .Infof (logger , cc .channelz , "dial target %q parse failed: %v" , canonicalTarget , err )
17161712 return err
17171713 }
1718- channelz .Infof (logger , cc .channelz , "parsed dial target is: %+v" , parsedTarget )
17191714 rb = cc .getResolver (parsedTarget .URL .Scheme )
17201715 if rb == nil {
17211716 return fmt .Errorf ("could not get resolver for default scheme: %q" , parsedTarget .URL .Scheme )
@@ -1805,7 +1800,7 @@ func encodeAuthority(authority string) string {
18051800// credentials do not match the authority configured through the dial option.
18061801//
18071802// Doesn't grab cc.mu as this method is expected to be called only at Dial time.
1808- func (cc * ClientConn ) determineAuthority () error {
1803+ func (cc * ClientConn ) initAuthority () error {
18091804 dopts := cc .dopts
18101805 // Historically, we had two options for users to specify the serverName or
18111806 // authority for a channel. One was through the transport credentials
@@ -1838,6 +1833,5 @@ func (cc *ClientConn) determineAuthority() error {
18381833 } else {
18391834 cc .authority = encodeAuthority (endpoint )
18401835 }
1841- channelz .Infof (logger , cc .channelz , "Channel authority set to %q" , cc .authority )
18421836 return nil
18431837}
0 commit comments