1515 */
1616package com .google .cloud .bigtable .hbase .wrappers .veneer ;
1717
18- import com .google .api .gax .core .BackgroundResource ;
1918import com .google .api .gax .core .CredentialsProvider ;
20- import com .google .api .gax .core .FixedCredentialsProvider ;
21- import com .google .api .gax .core .FixedExecutorProvider ;
19+ import com .google .api .gax .core .NoCredentialsProvider ;
2220import com .google .api .gax .rpc .ClientContext ;
23- import com .google .api .gax .rpc .FixedHeaderProvider ;
24- import com .google .api .gax .rpc .FixedTransportChannelProvider ;
25- import com .google .api .gax .rpc .FixedWatchdogProvider ;
2621import com .google .cloud .bigtable .data .v2 .BigtableDataClient ;
22+ import com .google .cloud .bigtable .data .v2 .BigtableDataClientFactory ;
2723import com .google .cloud .bigtable .data .v2 .BigtableDataSettings ;
28- import com .google .cloud .bigtable .data .v2 .BigtableDataSettings .Builder ;
2924import com .google .cloud .bigtable .data .v2 .stub .EnhancedBigtableStubSettings ;
3025import com .google .cloud .bigtable .hbase .wrappers .DataClientWrapper ;
3126import com .google .cloud .bigtable .metrics .BigtableClientMetrics ;
4136 * <p>This class is meant to support channel pool caching feature.
4237 */
4338class SharedDataClientWrapperFactory {
44- private final Map <Key , ClientContext > cachedContexts = new HashMap <>();
39+ private final Map <Key , BigtableDataClientFactory > cachedContexts = new HashMap <>();
4540 private final Map <Key , Integer > refCounts = new HashMap <>();
4641
4742 private final Map <Key , Integer > channelPoolSizes = new HashMap <>();
@@ -52,13 +47,14 @@ synchronized DataClientWrapper createDataClient(BigtableHBaseVeneerSettings sett
5247 Key key = Key .createFromSettings (settings .getDataSettings ());
5348
5449 // Get or create ClientContext that will contained the shared resources
55- ClientContext sharedCtx = cachedContexts .get (key );
50+ BigtableDataClientFactory sharedCtx = cachedContexts .get (key );
51+
5652 if (sharedCtx == null ) {
57- EnhancedBigtableStubSettings stubSettings = settings .getDataSettings ().getStubSettings ();
58- sharedCtx = ClientContext .create (stubSettings );
53+ sharedCtx = BigtableDataClientFactory .create (settings .getDataSettings ());
5954 cachedContexts .put (key , sharedCtx );
6055 refCounts .put (key , 0 );
61- int channelPoolSize = BigtableVeneerApi .getChannelPoolSize (stubSettings );
56+ int channelPoolSize =
57+ BigtableVeneerApi .getChannelPoolSize (settings .getDataSettings ().getStubSettings ());
6258 for (int i = 0 ; i < channelPoolSize ; i ++) {
6359 BigtableClientMetrics .counter (MetricLevel .Info , "grpc.channel.active" ).inc ();
6460 }
@@ -68,25 +64,17 @@ synchronized DataClientWrapper createDataClient(BigtableHBaseVeneerSettings sett
6864 refCounts .put (key , refCounts .get (key ) + 1 );
6965
7066 try {
71- // Patch settings to use shared resources
72- Builder builder = settings .getDataSettings ().toBuilder ();
73- builder
74- .stubSettings ()
75- .setRefreshingChannel (false )
76- .setTransportChannelProvider (
77- FixedTransportChannelProvider .create (sharedCtx .getTransportChannel ()))
78- .setCredentialsProvider (FixedCredentialsProvider .create (sharedCtx .getCredentials ()))
79- .setExecutorProvider (FixedExecutorProvider .create (sharedCtx .getExecutor ()))
80- .setStreamWatchdogProvider (FixedWatchdogProvider .create (sharedCtx .getStreamWatchdog ()))
81- .setHeaderProvider (FixedHeaderProvider .create (sharedCtx .getHeaders ()))
82- .setClock (sharedCtx .getClock ());
83-
84- BigtableDataSettings data = builder .build ();
67+ final BigtableDataClient client ;
68+ if (settings .getAppProfileId () == null ) {
69+ client = sharedCtx .createForInstance (settings .getProjectId (), settings .getInstanceId ());
70+ } else {
71+ client =
72+ sharedCtx .createForInstance (
73+ settings .getProjectId (), settings .getInstanceId (), settings .getAppProfileId ());
74+ }
8575 // Create a reference counted client wrapper
8676 return new SharedDataClientWrapper (
87- this ,
88- key ,
89- new DataClientVeneerApi (BigtableDataClient .create (data ), settings .getClientTimeouts ()));
77+ this , key , new DataClientVeneerApi (client , settings .getClientTimeouts ()));
9078 } catch (IOException | RuntimeException e ) {
9179 release (key );
9280 throw e ;
@@ -101,13 +89,15 @@ synchronized void release(Key key) {
10189 }
10290
10391 refCounts .remove (key );
104- ClientContext clientContext = cachedContexts .remove (key );
92+ BigtableDataClientFactory clientContext = cachedContexts .remove (key );
10593 for (int i = 0 ; i < channelPoolSizes .get (key ); i ++) {
10694 BigtableClientMetrics .counter (MetricLevel .Info , "grpc.channel.active" ).dec ();
10795 }
10896 channelPoolSizes .remove (key );
109- for (BackgroundResource resource : clientContext .getBackgroundResources ()) {
110- resource .shutdown ();
97+ try {
98+ clientContext .close ();
99+ } catch (Exception e ) {
100+ throw new RuntimeException (e );
111101 }
112102 }
113103
@@ -119,23 +109,24 @@ synchronized void release(Key key) {
119109 * compatible with a ClientContext required by {@link BigtableDataSettings}.
120110 */
121111 static final class Key {
112+ private static final NoCredentialsProvider NO_CREDENTIALS_PROVIDER_INSTANCE =
113+ NoCredentialsProvider .create ();
122114 private final String endpoint ;
123- private final Map <String , String > headers ;
124115 private final CredentialsProvider credentialsProvider ;
125116
126117 static Key createFromSettings (BigtableDataSettings settings ) {
127118 EnhancedBigtableStubSettings stubSettings = settings .getStubSettings ();
119+ CredentialsProvider effectiveCredProvider = stubSettings .getCredentialsProvider ();
120+ // NoCredentialsProvider doesnt implement equals, but all instances are equivalent
121+ if (effectiveCredProvider instanceof NoCredentialsProvider ) {
122+ effectiveCredProvider = NO_CREDENTIALS_PROVIDER_INSTANCE ;
123+ }
128124
129- return new Key (
130- stubSettings .getEndpoint (),
131- stubSettings .getHeaderProvider ().getHeaders (),
132- stubSettings .getCredentialsProvider ());
125+ return new Key (stubSettings .getEndpoint (), effectiveCredProvider );
133126 }
134127
135- private Key (
136- String endpoint , Map <String , String > headers , CredentialsProvider credentialsProvider ) {
128+ private Key (String endpoint , CredentialsProvider credentialsProvider ) {
137129 this .endpoint = endpoint ;
138- this .headers = headers ;
139130 this .credentialsProvider = credentialsProvider ;
140131 }
141132
@@ -149,13 +140,12 @@ public boolean equals(Object o) {
149140 }
150141 Key key = (Key ) o ;
151142 return Objects .equal (endpoint , key .endpoint )
152- && Objects .equal (headers , key .headers )
153143 && Objects .equal (credentialsProvider , key .credentialsProvider );
154144 }
155145
156146 @ Override
157147 public int hashCode () {
158- return Objects .hashCode (endpoint , headers , credentialsProvider );
148+ return Objects .hashCode (endpoint , credentialsProvider );
159149 }
160150 }
161151}
0 commit comments