aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar David G. Quintas <dgq@google.com>2018-07-11 17:10:56 -0700
committerGravatar GitHub <noreply@github.com>2018-07-11 17:10:56 -0700
commitea75af5e972055515bfbab93b2e0d4b48a9d3268 (patch)
tree94c3484590a4dfa4188e71155343167fab0b1382
parentf2cd616329ba5973ac1834f60bab65de7e7fdeaa (diff)
parent8427571d0602899591405b6fd4b7e9da96e47b14 (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.cc4
-rw-r--r--test/cpp/end2end/client_lb_end2end_test.cc17
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;