diff options
author | David G. Quintas <dgq@google.com> | 2018-07-11 17:10:56 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-11 17:10:56 -0700 |
commit | ea75af5e972055515bfbab93b2e0d4b48a9d3268 (patch) | |
tree | 94c3484590a4dfa4188e71155343167fab0b1382 | |
parent | f2cd616329ba5973ac1834f60bab65de7e7fdeaa (diff) | |
parent | 8427571d0602899591405b6fd4b7e9da96e47b14 (diff) |
Merge pull request #15947 from dgquintas/rr_ppicks_fix
Fixed ordering in adding pending picks to RR
-rw-r--r-- | src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc | 4 | ||||
-rw-r--r-- | test/cpp/end2end/client_lb_end2end_test.cc | 17 |
2 files changed, 19 insertions, 2 deletions
diff --git a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc index b177385065..42e8e88ec9 100644 --- a/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +++ b/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc @@ -354,11 +354,11 @@ bool RoundRobin::PickLocked(PickState* pick) { if (DoPickLocked(pick)) return true; } /* no pick currently available. Save for later in list of pending picks */ + pick->next = pending_picks_; + pending_picks_ = pick; if (!started_picking_) { StartPickingLocked(); } - pick->next = pending_picks_; - pending_picks_ = pick; return false; } diff --git a/test/cpp/end2end/client_lb_end2end_test.cc b/test/cpp/end2end/client_lb_end2end_test.cc index feea7c3907..8896fc6cae 100644 --- a/test/cpp/end2end/client_lb_end2end_test.cc +++ b/test/cpp/end2end/client_lb_end2end_test.cc @@ -539,6 +539,23 @@ TEST_F(ClientLbEnd2endTest, RoundRobin) { EXPECT_EQ("round_robin", channel->GetLoadBalancingPolicyName()); } +TEST_F(ClientLbEnd2endTest, RoundRobinProcessPending) { + StartServers(1); // Single server + auto channel = BuildChannel("round_robin"); + auto stub = BuildStub(channel); + SetNextResolution({servers_[0]->port_}); + WaitForServer(stub, 0, DEBUG_LOCATION); + // Create a new channel and its corresponding RR LB policy, which will pick + // the subchannels in READY state from the previous RPC against the same + // target (even if it happened over a different channel, because subchannels + // are globally reused). Progress should happen without any transition from + // this READY state. + auto second_channel = BuildChannel("round_robin"); + auto second_stub = BuildStub(second_channel); + SetNextResolution({servers_[0]->port_}); + CheckRpcSendOk(second_stub, DEBUG_LOCATION); +} + TEST_F(ClientLbEnd2endTest, RoundRobinUpdates) { // Start servers and send one RPC per server. const int kNumServers = 3; |