@@ -30,6 +30,7 @@ import (
3030 "google.golang.org/grpc/connectivity"
3131 "google.golang.org/grpc/credentials/insecure"
3232 "google.golang.org/grpc/internal/channelz"
33+ "google.golang.org/grpc/internal/envconfig"
3334 "google.golang.org/grpc/internal/grpcrand"
3435 "google.golang.org/grpc/internal/stubserver"
3536 "google.golang.org/grpc/internal/testutils"
@@ -382,6 +383,8 @@ func (s) TestPickFirst_StickyTransientFailure(t *testing.T) {
382383}
383384
384385func (s ) TestPickFirst_ShuffleAddressList (t * testing.T ) {
386+ defer func (old bool ) { envconfig .PickFirstLBConfig = old }(envconfig .PickFirstLBConfig )
387+ envconfig .PickFirstLBConfig = true
385388 const serviceConfig = `{"loadBalancingConfig": [{"pick_first":{ "shuffleAddressList": true }}]}`
386389
387390 // Install a shuffler that always reverses two entries.
@@ -431,3 +434,58 @@ func (s) TestPickFirst_ShuffleAddressList(t *testing.T) {
431434 t .Fatal (err )
432435 }
433436}
437+
438+ func (s ) TestPickFirst_ShuffleAddressListDisabled (t * testing.T ) {
439+ defer func (old bool ) { envconfig .PickFirstLBConfig = old }(envconfig .PickFirstLBConfig )
440+ envconfig .PickFirstLBConfig = false
441+ const serviceConfig = `{"loadBalancingConfig": [{"pick_first":{ "shuffleAddressList": true }}]}`
442+
443+ // Install a shuffler that always reverses two entries.
444+ origShuf := grpcrand .Shuffle
445+ defer func () { grpcrand .Shuffle = origShuf }()
446+ grpcrand .Shuffle = func (n int , f func (int , int )) {
447+ if n != 2 {
448+ t .Errorf ("Shuffle called with n=%v; want 2" , n )
449+ }
450+ f (0 , 1 ) // reverse the two addresses
451+ }
452+
453+ // Set up our backends.
454+ cc , r , backends := setupPickFirst (t , 2 )
455+ addrs := stubBackendsToResolverAddrs (backends )
456+
457+ ctx , cancel := context .WithTimeout (context .Background (), defaultTestTimeout )
458+ defer cancel ()
459+
460+ // Push an update with both addresses and shuffling disabled. We should
461+ // connect to backend 0.
462+ r .UpdateState (resolver.State {Addresses : []resolver.Address {addrs [0 ], addrs [1 ]}})
463+ if err := pickfirst .CheckRPCsToBackend (ctx , cc , addrs [0 ]); err != nil {
464+ t .Fatal (err )
465+ }
466+
467+ // Send a config with shuffling enabled. This will reverse the addresses,
468+ // but the channel should still be connected to backend 0.
469+ shufState := resolver.State {
470+ ServiceConfig : parseServiceConfig (t , r , serviceConfig ),
471+ Addresses : []resolver.Address {addrs [0 ], addrs [1 ]},
472+ }
473+ r .UpdateState (shufState )
474+ if err := pickfirst .CheckRPCsToBackend (ctx , cc , addrs [0 ]); err != nil {
475+ t .Fatal (err )
476+ }
477+
478+ // Send a resolver update with no addresses. This should push the channel
479+ // into TransientFailure.
480+ r .UpdateState (resolver.State {})
481+ awaitState (ctx , t , cc , connectivity .TransientFailure )
482+
483+ // Send the same config as last time with shuffling enabled. Since we are
484+ // not connected to backend 0, we should connect to backend 1 if shuffling
485+ // is supported. However with it disabled at the start of the test, we
486+ // will connect to backend 0 instead.
487+ r .UpdateState (shufState )
488+ if err := pickfirst .CheckRPCsToBackend (ctx , cc , addrs [0 ]); err != nil {
489+ t .Fatal (err )
490+ }
491+ }
0 commit comments