3333import com .google .bigtable .v2 .LoadBalancingOptions .LeastInFlight ;
3434import com .google .bigtable .v2 .LoadBalancingOptions .PeakEwma ;
3535import com .google .bigtable .v2 .SessionClientConfiguration ;
36+ import com .google .bigtable .v2 .SessionClientConfiguration .ChannelPoolConfiguration .DirectAccessWithFallback ;
3637import com .google .bigtable .v2 .SessionClientConfiguration .SessionPoolConfiguration ;
3738import com .google .cloud .bigtable .data .v2 .FakeServiceBuilder ;
3839import com .google .cloud .bigtable .data .v2 .internal .api .ChannelProviders ;
@@ -465,6 +466,59 @@ public void onChange(SessionClientConfiguration newValue) {
465466 assertThat (retrievedConfig .get ()).isNotNull ();
466467 }
467468
469+ @ Test
470+ void disableDirectPathFallbackTest () throws Exception {
471+ Properties sysProps = new Properties ();
472+ sysProps .setProperty (
473+ ClientConfigurationManager .DISABLE_DIRECT_ACCESS_FALLBACK_SYS_PROP_KEY , "true" );
474+ String clientConfigOverrides =
475+ TextFormat .printer ()
476+ .printToString (
477+ ClientConfiguration .newBuilder ()
478+ .setSessionConfiguration (
479+ SessionClientConfiguration .newBuilder ()
480+ .setSessionLoad (0.75f )
481+ .setChannelConfiguration (
482+ SessionClientConfiguration .ChannelPoolConfiguration .newBuilder ()
483+ .setDirectAccessWithFallback (
484+ DirectAccessWithFallback .getDefaultInstance ())))
485+ .build ());
486+ sysProps .setProperty (ClientConfigurationManager .OVERRIDE_SYS_PROP_KEY , clientConfigOverrides );
487+
488+ try (ClientConfigurationManager fallbackDisabledManager =
489+ new ClientConfigurationManager (
490+ sysProps , FEATURE_FLAGS , CLIENT_INFO , channelProvider , noopDebugTracer , mockExecutor )) {
491+
492+ // Check initial default config with override has fallback disabled and direct_access_only set
493+ SessionClientConfiguration .ChannelPoolConfiguration initialChannelConfig =
494+ fallbackDisabledManager
495+ .getClientConfiguration ()
496+ .getSessionConfiguration ()
497+ .getChannelConfiguration ();
498+ assertThat (initialChannelConfig .hasDirectAccessOnly ()).isTrue ();
499+ assertThat (initialChannelConfig .hasDirectAccessWithFallback ()).isFalse ();
500+
501+ // Start manager and fetch server config (which sends direct_access_with_fallback)
502+ ClientConfiguration fetchedConfig = fallbackDisabledManager .start ().get ();
503+ SessionClientConfiguration .ChannelPoolConfiguration fetchedChannelConfig =
504+ fetchedConfig .getSessionConfiguration ().getChannelConfiguration ();
505+
506+ // Verify that direct_access_with_fallback is converted to direct_access_only
507+ assertThat (fetchedChannelConfig .hasDirectAccessOnly ()).isTrue ();
508+ assertThat (fetchedChannelConfig .hasDirectAccessWithFallback ()).isFalse ();
509+
510+ // Verify other channel pool configuration fields from the server are preserved
511+ SessionClientConfiguration .ChannelPoolConfiguration serverChannelConfig =
512+ service .config .get ().getSessionConfiguration ().getChannelConfiguration ();
513+ assertThat (fetchedChannelConfig .getMinServerCount ())
514+ .isEqualTo (serverChannelConfig .getMinServerCount ());
515+ assertThat (fetchedChannelConfig .getMaxServerCount ())
516+ .isEqualTo (serverChannelConfig .getMaxServerCount ());
517+ assertThat (fetchedChannelConfig .getPerServerSessionCount ())
518+ .isEqualTo (serverChannelConfig .getPerServerSessionCount ());
519+ }
520+ }
521+
468522 static class FakeConfigService extends BigtableGrpc .BigtableImplBase {
469523 private final AtomicReference <ClientConfiguration > config = new AtomicReference <>();
470524
@@ -475,6 +529,12 @@ static class FakeConfigService extends BigtableGrpc.BigtableImplBase {
475529 public FakeConfigService () throws IOException {
476530 ClientConfiguration .Builder builder = ClientConfigurationManager .loadDefault ().toBuilder ();
477531 builder .getSessionConfigurationBuilder ().setSessionLoad (0.25f );
532+ builder
533+ .getSessionConfigurationBuilder ()
534+ .getChannelConfigurationBuilder ()
535+ .setMinServerCount (2 )
536+ .setMaxServerCount (10 )
537+ .setPerServerSessionCount (15 );
478538 config .set (builder .build ());
479539 }
480540
0 commit comments