grpclb_end2end_test.cc 81 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038
  1. //
  2. // Copyright 2017 gRPC authors.
  3. //
  4. // Licensed under the Apache License, Version 2.0 (the "License");
  5. // you may not use this file except in compliance with the License.
  6. // You may obtain a copy of the License at
  7. //
  8. // http://www.apache.org/licenses/LICENSE-2.0
  9. //
  10. // Unless required by applicable law or agreed to in writing, software
  11. // distributed under the License is distributed on an "AS IS" BASIS,
  12. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. // See the License for the specific language governing permissions and
  14. // limitations under the License.
  15. //
  16. #include <deque>
  17. #include <memory>
  18. #include <mutex>
  19. #include <set>
  20. #include <sstream>
  21. #include <string>
  22. #include <thread>
  23. #include <gmock/gmock.h>
  24. #include <gtest/gtest.h>
  25. #include "absl/memory/memory.h"
  26. #include "absl/strings/str_cat.h"
  27. #include "absl/strings/str_format.h"
  28. #include <grpc/grpc.h>
  29. #include <grpc/support/alloc.h>
  30. #include <grpc/support/log.h>
  31. #include <grpc/support/time.h>
  32. #include <grpcpp/channel.h>
  33. #include <grpcpp/client_context.h>
  34. #include <grpcpp/create_channel.h>
  35. #include <grpcpp/impl/codegen/sync.h>
  36. #include <grpcpp/server.h>
  37. #include <grpcpp/server_builder.h>
  38. #include "src/core/ext/filters/client_channel/backup_poller.h"
  39. #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h"
  40. #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_balancer_addresses.h"
  41. #include "src/core/ext/filters/client_channel/resolver/fake/fake_resolver.h"
  42. #include "src/core/lib/address_utils/parse_address.h"
  43. #include "src/core/lib/gpr/env.h"
  44. #include "src/core/lib/gprpp/ref_counted_ptr.h"
  45. #include "src/core/lib/iomgr/sockaddr.h"
  46. #include "src/core/lib/resolver/server_address.h"
  47. #include "src/core/lib/security/credentials/fake/fake_credentials.h"
  48. #include "src/core/lib/service_config/service_config_impl.h"
  49. #include "src/cpp/client/secure_credentials.h"
  50. #include "src/cpp/server/secure_server_credentials.h"
  51. #include "src/proto/grpc/lb/v1/load_balancer.grpc.pb.h"
  52. #include "src/proto/grpc/testing/echo.grpc.pb.h"
  53. #include "test/core/util/port.h"
  54. #include "test/core/util/resolve_localhost_ip46.h"
  55. #include "test/core/util/test_config.h"
  56. #include "test/cpp/end2end/counted_service.h"
  57. #include "test/cpp/end2end/test_service_impl.h"
  58. #include "test/cpp/util/test_config.h"
  59. // TODO(dgq): Other scenarios in need of testing:
  60. // - Send a serverlist with faulty ip:port addresses (port > 2^16, etc).
  61. // - Test reception of invalid serverlist
  62. // - Test against a non-LB server.
  63. // - Random LB server closing the stream unexpectedly.
  64. //
  65. // Findings from end to end testing to be covered here:
  66. // - Handling of LB servers restart, including reconnection after backing-off
  67. // retries.
  68. // - Destruction of load balanced channel (and therefore of grpclb instance)
  69. // while:
  70. // 1) the internal LB call is still active. This should work by virtue
  71. // of the weak reference the LB call holds. The call should be terminated as
  72. // part of the grpclb shutdown process.
  73. // 2) the retry timer is active. Again, the weak reference it holds should
  74. // prevent a premature call to \a glb_destroy.
  75. using std::chrono::system_clock;
  76. using grpc::lb::v1::LoadBalancer;
  77. using grpc::lb::v1::LoadBalanceRequest;
  78. using grpc::lb::v1::LoadBalanceResponse;
  79. namespace grpc {
  80. namespace testing {
  81. namespace {
  82. constexpr char kDefaultServiceConfig[] =
  83. "{\n"
  84. " \"loadBalancingConfig\":[\n"
  85. " { \"grpclb\":{} }\n"
  86. " ]\n"
  87. "}";
  88. using BackendService = CountedService<TestServiceImpl>;
  89. using BalancerService = CountedService<LoadBalancer::Service>;
  90. const char g_kCallCredsMdKey[] = "Balancer should not ...";
  91. const char g_kCallCredsMdValue[] = "... receive me";
  92. class BackendServiceImpl : public BackendService {
  93. public:
  94. BackendServiceImpl() {}
  95. Status Echo(ServerContext* context, const EchoRequest* request,
  96. EchoResponse* response) override {
  97. // Backend should receive the call credentials metadata.
  98. auto call_credentials_entry =
  99. context->client_metadata().find(g_kCallCredsMdKey);
  100. EXPECT_NE(call_credentials_entry, context->client_metadata().end());
  101. if (call_credentials_entry != context->client_metadata().end()) {
  102. EXPECT_EQ(call_credentials_entry->second, g_kCallCredsMdValue);
  103. }
  104. IncreaseRequestCount();
  105. const auto status = TestServiceImpl::Echo(context, request, response);
  106. IncreaseResponseCount();
  107. AddClient(context->peer());
  108. return status;
  109. }
  110. void Start() {}
  111. void Shutdown() {}
  112. std::set<std::string> clients() {
  113. grpc::internal::MutexLock lock(&clients_mu_);
  114. return clients_;
  115. }
  116. private:
  117. void AddClient(const std::string& client) {
  118. grpc::internal::MutexLock lock(&clients_mu_);
  119. clients_.insert(client);
  120. }
  121. grpc::internal::Mutex clients_mu_;
  122. std::set<std::string> clients_ ABSL_GUARDED_BY(&clients_mu_);
  123. };
  124. std::string Ip4ToPackedString(const char* ip_str) {
  125. struct in_addr ip4;
  126. GPR_ASSERT(inet_pton(AF_INET, ip_str, &ip4) == 1);
  127. return std::string(reinterpret_cast<const char*>(&ip4), sizeof(ip4));
  128. }
  129. std::string Ip6ToPackedString(const char* ip_str) {
  130. struct in6_addr ip6;
  131. GPR_ASSERT(inet_pton(AF_INET6, ip_str, &ip6) == 1);
  132. return std::string(reinterpret_cast<const char*>(&ip6), sizeof(ip6));
  133. }
  134. struct ClientStats {
  135. size_t num_calls_started = 0;
  136. size_t num_calls_finished = 0;
  137. size_t num_calls_finished_with_client_failed_to_send = 0;
  138. size_t num_calls_finished_known_received = 0;
  139. std::map<std::string, size_t> drop_token_counts;
  140. ClientStats& operator+=(const ClientStats& other) {
  141. num_calls_started += other.num_calls_started;
  142. num_calls_finished += other.num_calls_finished;
  143. num_calls_finished_with_client_failed_to_send +=
  144. other.num_calls_finished_with_client_failed_to_send;
  145. num_calls_finished_known_received +=
  146. other.num_calls_finished_known_received;
  147. for (const auto& p : other.drop_token_counts) {
  148. drop_token_counts[p.first] += p.second;
  149. }
  150. return *this;
  151. }
  152. void Reset() {
  153. num_calls_started = 0;
  154. num_calls_finished = 0;
  155. num_calls_finished_with_client_failed_to_send = 0;
  156. num_calls_finished_known_received = 0;
  157. drop_token_counts.clear();
  158. }
  159. };
  160. class BalancerServiceImpl : public BalancerService {
  161. public:
  162. using Stream = ServerReaderWriter<LoadBalanceResponse, LoadBalanceRequest>;
  163. using ResponseDelayPair = std::pair<LoadBalanceResponse, int>;
  164. explicit BalancerServiceImpl(int client_load_reporting_interval_seconds)
  165. : client_load_reporting_interval_seconds_(
  166. client_load_reporting_interval_seconds) {}
  167. Status BalanceLoad(ServerContext* context, Stream* stream) override {
  168. gpr_log(GPR_INFO, "LB[%p]: BalanceLoad", this);
  169. {
  170. grpc::internal::MutexLock lock(&mu_);
  171. if (serverlist_done_) goto done;
  172. }
  173. {
  174. // Balancer shouldn't receive the call credentials metadata.
  175. EXPECT_EQ(context->client_metadata().find(g_kCallCredsMdKey),
  176. context->client_metadata().end());
  177. LoadBalanceRequest request;
  178. std::vector<ResponseDelayPair> responses_and_delays;
  179. if (!stream->Read(&request)) {
  180. goto done;
  181. } else {
  182. if (request.has_initial_request()) {
  183. grpc::internal::MutexLock lock(&mu_);
  184. service_names_.push_back(request.initial_request().name());
  185. }
  186. }
  187. IncreaseRequestCount();
  188. gpr_log(GPR_INFO, "LB[%p]: received initial message '%s'", this,
  189. request.DebugString().c_str());
  190. // TODO(juanlishen): Initial response should always be the first response.
  191. if (client_load_reporting_interval_seconds_ > 0) {
  192. LoadBalanceResponse initial_response;
  193. initial_response.mutable_initial_response()
  194. ->mutable_client_stats_report_interval()
  195. ->set_seconds(client_load_reporting_interval_seconds_);
  196. stream->Write(initial_response);
  197. }
  198. {
  199. grpc::internal::MutexLock lock(&mu_);
  200. responses_and_delays = responses_and_delays_;
  201. }
  202. for (const auto& response_and_delay : responses_and_delays) {
  203. SendResponse(stream, response_and_delay.first,
  204. response_and_delay.second);
  205. }
  206. {
  207. grpc::internal::MutexLock lock(&mu_);
  208. while (!serverlist_done_) {
  209. serverlist_cond_.Wait(&mu_);
  210. }
  211. }
  212. if (client_load_reporting_interval_seconds_ > 0) {
  213. request.Clear();
  214. while (stream->Read(&request)) {
  215. gpr_log(GPR_INFO, "LB[%p]: received client load report message '%s'",
  216. this, request.DebugString().c_str());
  217. GPR_ASSERT(request.has_client_stats());
  218. ClientStats load_report;
  219. load_report.num_calls_started =
  220. request.client_stats().num_calls_started();
  221. load_report.num_calls_finished =
  222. request.client_stats().num_calls_finished();
  223. load_report.num_calls_finished_with_client_failed_to_send =
  224. request.client_stats()
  225. .num_calls_finished_with_client_failed_to_send();
  226. load_report.num_calls_finished_known_received =
  227. request.client_stats().num_calls_finished_known_received();
  228. for (const auto& drop_token_count :
  229. request.client_stats().calls_finished_with_drop()) {
  230. load_report
  231. .drop_token_counts[drop_token_count.load_balance_token()] =
  232. drop_token_count.num_calls();
  233. }
  234. // We need to acquire the lock here in order to prevent the notify_one
  235. // below from firing before its corresponding wait is executed.
  236. grpc::internal::MutexLock lock(&mu_);
  237. load_report_queue_.emplace_back(std::move(load_report));
  238. load_report_cond_.Signal();
  239. }
  240. }
  241. }
  242. done:
  243. gpr_log(GPR_INFO, "LB[%p]: done", this);
  244. return Status::OK;
  245. }
  246. void add_response(const LoadBalanceResponse& response, int send_after_ms) {
  247. grpc::internal::MutexLock lock(&mu_);
  248. responses_and_delays_.push_back(std::make_pair(response, send_after_ms));
  249. }
  250. void Start() {
  251. grpc::internal::MutexLock lock(&mu_);
  252. serverlist_done_ = false;
  253. responses_and_delays_.clear();
  254. load_report_queue_.clear();
  255. }
  256. void Shutdown() {
  257. NotifyDoneWithServerlists();
  258. gpr_log(GPR_INFO, "LB[%p]: shut down", this);
  259. }
  260. ClientStats WaitForLoadReport() {
  261. grpc::internal::MutexLock lock(&mu_);
  262. if (load_report_queue_.empty()) {
  263. while (load_report_queue_.empty()) {
  264. load_report_cond_.Wait(&mu_);
  265. }
  266. }
  267. ClientStats load_report = std::move(load_report_queue_.front());
  268. load_report_queue_.pop_front();
  269. return load_report;
  270. }
  271. void NotifyDoneWithServerlists() {
  272. grpc::internal::MutexLock lock(&mu_);
  273. if (!serverlist_done_) {
  274. serverlist_done_ = true;
  275. serverlist_cond_.SignalAll();
  276. }
  277. }
  278. std::vector<std::string> service_names() {
  279. grpc::internal::MutexLock lock(&mu_);
  280. return service_names_;
  281. }
  282. private:
  283. void SendResponse(Stream* stream, const LoadBalanceResponse& response,
  284. int delay_ms) {
  285. gpr_log(GPR_INFO, "LB[%p]: sleeping for %d ms...", this, delay_ms);
  286. if (delay_ms > 0) {
  287. gpr_sleep_until(grpc_timeout_milliseconds_to_deadline(delay_ms));
  288. }
  289. gpr_log(GPR_INFO, "LB[%p]: Woke up! Sending response '%s'", this,
  290. response.DebugString().c_str());
  291. IncreaseResponseCount();
  292. stream->Write(response);
  293. }
  294. const int client_load_reporting_interval_seconds_;
  295. std::vector<ResponseDelayPair> responses_and_delays_;
  296. std::vector<std::string> service_names_;
  297. grpc::internal::Mutex mu_;
  298. grpc::internal::CondVar serverlist_cond_;
  299. bool serverlist_done_ ABSL_GUARDED_BY(mu_) = false;
  300. grpc::internal::CondVar load_report_cond_;
  301. std::deque<ClientStats> load_report_queue_ ABSL_GUARDED_BY(mu_);
  302. };
  303. class GrpclbEnd2endTest : public ::testing::Test {
  304. protected:
  305. GrpclbEnd2endTest(size_t num_backends, size_t num_balancers,
  306. int client_load_reporting_interval_seconds)
  307. : server_host_("localhost"),
  308. num_backends_(num_backends),
  309. num_balancers_(num_balancers),
  310. client_load_reporting_interval_seconds_(
  311. client_load_reporting_interval_seconds) {}
  312. static void SetUpTestCase() {
  313. // Make the backup poller poll very frequently in order to pick up
  314. // updates from all the subchannels's FDs.
  315. GPR_GLOBAL_CONFIG_SET(grpc_client_channel_backup_poll_interval_ms, 1);
  316. #if TARGET_OS_IPHONE
  317. // Workaround Apple CFStream bug
  318. gpr_setenv("grpc_cfstream", "0");
  319. #endif
  320. grpc_init();
  321. }
  322. static void TearDownTestCase() { grpc_shutdown(); }
  323. void SetUp() override {
  324. bool localhost_resolves_to_ipv4 = false;
  325. bool localhost_resolves_to_ipv6 = false;
  326. grpc_core::LocalhostResolves(&localhost_resolves_to_ipv4,
  327. &localhost_resolves_to_ipv6);
  328. ipv6_only_ = !localhost_resolves_to_ipv4 && localhost_resolves_to_ipv6;
  329. response_generator_ =
  330. grpc_core::MakeRefCounted<grpc_core::FakeResolverResponseGenerator>();
  331. // Start the backends.
  332. for (size_t i = 0; i < num_backends_; ++i) {
  333. backends_.emplace_back(new ServerThread<BackendServiceImpl>("backend"));
  334. backends_.back()->Start(server_host_);
  335. }
  336. // Start the load balancers.
  337. for (size_t i = 0; i < num_balancers_; ++i) {
  338. balancers_.emplace_back(new ServerThread<BalancerServiceImpl>(
  339. "balancer", client_load_reporting_interval_seconds_));
  340. balancers_.back()->Start(server_host_);
  341. }
  342. ResetStub();
  343. }
  344. void TearDown() override {
  345. ShutdownAllBackends();
  346. for (auto& balancer : balancers_) balancer->Shutdown();
  347. }
  348. void StartAllBackends() {
  349. for (auto& backend : backends_) backend->Start(server_host_);
  350. }
  351. void StartBackend(size_t index) { backends_[index]->Start(server_host_); }
  352. void ShutdownAllBackends() {
  353. for (auto& backend : backends_) backend->Shutdown();
  354. }
  355. void ShutdownBackend(size_t index) { backends_[index]->Shutdown(); }
  356. void ResetStub(int fallback_timeout = 0,
  357. const std::string& expected_targets = "",
  358. int subchannel_cache_delay_ms = 0) {
  359. ChannelArguments args;
  360. if (fallback_timeout > 0) args.SetGrpclbFallbackTimeout(fallback_timeout);
  361. args.SetPointer(GRPC_ARG_FAKE_RESOLVER_RESPONSE_GENERATOR,
  362. response_generator_.get());
  363. if (!expected_targets.empty()) {
  364. args.SetString(GRPC_ARG_FAKE_SECURITY_EXPECTED_TARGETS, expected_targets);
  365. }
  366. if (subchannel_cache_delay_ms > 0) {
  367. args.SetInt(GRPC_ARG_GRPCLB_SUBCHANNEL_CACHE_INTERVAL_MS,
  368. subchannel_cache_delay_ms * grpc_test_slowdown_factor());
  369. }
  370. std::ostringstream uri;
  371. uri << "fake:///" << kApplicationTargetName_;
  372. // TODO(dgq): templatize tests to run everything using both secure and
  373. // insecure channel credentials.
  374. grpc_channel_credentials* channel_creds =
  375. grpc_fake_transport_security_credentials_create();
  376. grpc_call_credentials* call_creds = grpc_md_only_test_credentials_create(
  377. g_kCallCredsMdKey, g_kCallCredsMdValue);
  378. std::shared_ptr<ChannelCredentials> creds(
  379. new SecureChannelCredentials(grpc_composite_channel_credentials_create(
  380. channel_creds, call_creds, nullptr)));
  381. call_creds->Unref();
  382. channel_creds->Unref();
  383. channel_ = grpc::CreateCustomChannel(uri.str(), creds, args);
  384. stub_ = grpc::testing::EchoTestService::NewStub(channel_);
  385. }
  386. void ResetBackendCounters() {
  387. for (auto& backend : backends_) backend->service_.ResetCounters();
  388. }
  389. ClientStats WaitForLoadReports() {
  390. ClientStats client_stats;
  391. for (auto& balancer : balancers_) {
  392. client_stats += balancer->service_.WaitForLoadReport();
  393. }
  394. return client_stats;
  395. }
  396. bool SeenAllBackends(size_t start_index = 0, size_t stop_index = 0) {
  397. if (stop_index == 0) stop_index = backends_.size();
  398. for (size_t i = start_index; i < stop_index; ++i) {
  399. if (backends_[i]->service_.request_count() == 0) return false;
  400. }
  401. return true;
  402. }
  403. void SendRpcAndCount(int* num_total, int* num_ok, int* num_failure,
  404. int* num_drops) {
  405. const Status status = SendRpc();
  406. if (status.ok()) {
  407. ++*num_ok;
  408. } else {
  409. if (status.error_message() == "drop directed by grpclb balancer") {
  410. ++*num_drops;
  411. } else {
  412. ++*num_failure;
  413. }
  414. }
  415. ++*num_total;
  416. }
  417. std::tuple<int, int, int> WaitForAllBackends(int num_requests_multiple_of = 1,
  418. size_t start_index = 0,
  419. size_t stop_index = 0) {
  420. int num_ok = 0;
  421. int num_failure = 0;
  422. int num_drops = 0;
  423. int num_total = 0;
  424. while (!SeenAllBackends(start_index, stop_index)) {
  425. SendRpcAndCount(&num_total, &num_ok, &num_failure, &num_drops);
  426. }
  427. while (num_total % num_requests_multiple_of != 0) {
  428. SendRpcAndCount(&num_total, &num_ok, &num_failure, &num_drops);
  429. }
  430. ResetBackendCounters();
  431. gpr_log(GPR_INFO,
  432. "Performed %d warm up requests (a multiple of %d) against the "
  433. "backends. %d succeeded, %d failed, %d dropped.",
  434. num_total, num_requests_multiple_of, num_ok, num_failure,
  435. num_drops);
  436. return std::make_tuple(num_ok, num_failure, num_drops);
  437. }
  438. void WaitForBackend(size_t backend_idx) {
  439. do {
  440. (void)SendRpc();
  441. } while (backends_[backend_idx]->service_.request_count() == 0);
  442. ResetBackendCounters();
  443. }
  444. struct AddressData {
  445. int port;
  446. std::string balancer_name;
  447. };
  448. grpc_core::ServerAddressList CreateLbAddressesFromAddressDataList(
  449. const std::vector<AddressData>& address_data) {
  450. grpc_core::ServerAddressList addresses;
  451. for (const auto& addr : address_data) {
  452. absl::StatusOr<grpc_core::URI> lb_uri =
  453. grpc_core::URI::Parse(absl::StrCat(
  454. ipv6_only_ ? "ipv6:[::1]:" : "ipv4:127.0.0.1:", addr.port));
  455. GPR_ASSERT(lb_uri.ok());
  456. grpc_resolved_address address;
  457. GPR_ASSERT(grpc_parse_uri(*lb_uri, &address));
  458. grpc_arg arg = grpc_channel_arg_string_create(
  459. const_cast<char*>(GRPC_ARG_DEFAULT_AUTHORITY),
  460. const_cast<char*>(addr.balancer_name.c_str()));
  461. grpc_channel_args* args =
  462. grpc_channel_args_copy_and_add(nullptr, &arg, 1);
  463. addresses.emplace_back(address.addr, address.len, args);
  464. }
  465. return addresses;
  466. }
  467. grpc_core::Resolver::Result MakeResolverResult(
  468. const std::vector<AddressData>& balancer_address_data,
  469. const std::vector<AddressData>& backend_address_data = {},
  470. const char* service_config_json = kDefaultServiceConfig) {
  471. grpc_core::Resolver::Result result;
  472. result.addresses =
  473. CreateLbAddressesFromAddressDataList(backend_address_data);
  474. grpc_error_handle error = GRPC_ERROR_NONE;
  475. result.service_config = grpc_core::ServiceConfigImpl::Create(
  476. nullptr, service_config_json, &error);
  477. GPR_ASSERT(error == GRPC_ERROR_NONE);
  478. grpc_core::ServerAddressList balancer_addresses =
  479. CreateLbAddressesFromAddressDataList(balancer_address_data);
  480. grpc_arg arg = CreateGrpclbBalancerAddressesArg(&balancer_addresses);
  481. result.args = grpc_channel_args_copy_and_add(nullptr, &arg, 1);
  482. return result;
  483. }
  484. void SetNextResolutionAllBalancers(
  485. const char* service_config_json = kDefaultServiceConfig) {
  486. std::vector<AddressData> addresses;
  487. for (size_t i = 0; i < balancers_.size(); ++i) {
  488. addresses.emplace_back(AddressData{balancers_[i]->port_, ""});
  489. }
  490. SetNextResolution(addresses, {}, service_config_json);
  491. }
  492. void SetNextResolution(
  493. const std::vector<AddressData>& balancer_address_data,
  494. const std::vector<AddressData>& backend_address_data = {},
  495. const char* service_config_json = kDefaultServiceConfig) {
  496. grpc_core::ExecCtx exec_ctx;
  497. grpc_core::Resolver::Result result = MakeResolverResult(
  498. balancer_address_data, backend_address_data, service_config_json);
  499. response_generator_->SetResponse(std::move(result));
  500. }
  501. void SetNextReresolutionResponse(
  502. const std::vector<AddressData>& balancer_address_data,
  503. const std::vector<AddressData>& backend_address_data = {},
  504. const char* service_config_json = kDefaultServiceConfig) {
  505. grpc_core::ExecCtx exec_ctx;
  506. grpc_core::Resolver::Result result = MakeResolverResult(
  507. balancer_address_data, backend_address_data, service_config_json);
  508. response_generator_->SetReresolutionResponse(std::move(result));
  509. }
  510. std::vector<int> GetBackendPorts(size_t start_index = 0,
  511. size_t stop_index = 0) const {
  512. if (stop_index == 0) stop_index = backends_.size();
  513. std::vector<int> backend_ports;
  514. for (size_t i = start_index; i < stop_index; ++i) {
  515. backend_ports.push_back(backends_[i]->port_);
  516. }
  517. return backend_ports;
  518. }
  519. void ScheduleResponseForBalancer(size_t i,
  520. const LoadBalanceResponse& response,
  521. int delay_ms) {
  522. balancers_[i]->service_.add_response(response, delay_ms);
  523. }
  524. LoadBalanceResponse BuildResponseForBackends(
  525. const std::vector<int>& backend_ports,
  526. const std::map<std::string, size_t>& drop_token_counts) {
  527. LoadBalanceResponse response;
  528. for (const auto& drop_token_count : drop_token_counts) {
  529. for (size_t i = 0; i < drop_token_count.second; ++i) {
  530. auto* server = response.mutable_server_list()->add_servers();
  531. server->set_drop(true);
  532. server->set_load_balance_token(drop_token_count.first);
  533. }
  534. }
  535. for (const int& backend_port : backend_ports) {
  536. auto* server = response.mutable_server_list()->add_servers();
  537. server->set_ip_address(ipv6_only_ ? Ip6ToPackedString("::1")
  538. : Ip4ToPackedString("127.0.0.1"));
  539. server->set_port(backend_port);
  540. static int token_count = 0;
  541. server->set_load_balance_token(
  542. absl::StrFormat("token%03d", ++token_count));
  543. }
  544. return response;
  545. }
  546. Status SendRpc(EchoResponse* response = nullptr, int timeout_ms = 1000,
  547. bool wait_for_ready = false,
  548. const Status& expected_status = Status::OK) {
  549. const bool local_response = (response == nullptr);
  550. if (local_response) response = new EchoResponse;
  551. EchoRequest request;
  552. request.set_message(kRequestMessage_);
  553. if (!expected_status.ok()) {
  554. auto* error = request.mutable_param()->mutable_expected_error();
  555. error->set_code(expected_status.error_code());
  556. error->set_error_message(expected_status.error_message());
  557. }
  558. ClientContext context;
  559. context.set_deadline(grpc_timeout_milliseconds_to_deadline(timeout_ms));
  560. if (wait_for_ready) context.set_wait_for_ready(true);
  561. Status status = stub_->Echo(&context, request, response);
  562. if (local_response) delete response;
  563. return status;
  564. }
  565. void CheckRpcSendOk(const size_t times = 1, const int timeout_ms = 1000,
  566. bool wait_for_ready = false) {
  567. for (size_t i = 0; i < times; ++i) {
  568. EchoResponse response;
  569. const Status status = SendRpc(&response, timeout_ms, wait_for_ready);
  570. EXPECT_TRUE(status.ok()) << "code=" << status.error_code()
  571. << " message=" << status.error_message();
  572. EXPECT_EQ(response.message(), kRequestMessage_);
  573. }
  574. }
  575. void CheckRpcSendFailure() {
  576. const Status status = SendRpc();
  577. EXPECT_FALSE(status.ok());
  578. }
  579. template <typename T>
  580. struct ServerThread {
  581. template <typename... Args>
  582. explicit ServerThread(const std::string& type, Args&&... args)
  583. : port_(grpc_pick_unused_port_or_die()),
  584. type_(type),
  585. service_(std::forward<Args>(args)...) {}
  586. void Start(const std::string& server_host) {
  587. gpr_log(GPR_INFO, "starting %s server on port %d", type_.c_str(), port_);
  588. GPR_ASSERT(!running_);
  589. running_ = true;
  590. service_.Start();
  591. grpc::internal::Mutex mu;
  592. // We need to acquire the lock here in order to prevent the notify_one
  593. // by ServerThread::Serve from firing before the wait below is hit.
  594. grpc::internal::MutexLock lock(&mu);
  595. grpc::internal::CondVar cond;
  596. thread_ = absl::make_unique<std::thread>(
  597. std::bind(&ServerThread::Serve, this, server_host, &mu, &cond));
  598. cond.Wait(&mu);
  599. gpr_log(GPR_INFO, "%s server startup complete", type_.c_str());
  600. }
  601. void Serve(const std::string& server_host, grpc::internal::Mutex* mu,
  602. grpc::internal::CondVar* cond) {
  603. // We need to acquire the lock here in order to prevent the notify_one
  604. // below from firing before its corresponding wait is executed.
  605. grpc::internal::MutexLock lock(mu);
  606. std::ostringstream server_address;
  607. server_address << server_host << ":" << port_;
  608. ServerBuilder builder;
  609. std::shared_ptr<ServerCredentials> creds(new SecureServerCredentials(
  610. grpc_fake_transport_security_server_credentials_create()));
  611. builder.AddListeningPort(server_address.str(), creds);
  612. builder.RegisterService(&service_);
  613. server_ = builder.BuildAndStart();
  614. cond->Signal();
  615. }
  616. void Shutdown() {
  617. if (!running_) return;
  618. gpr_log(GPR_INFO, "%s about to shutdown", type_.c_str());
  619. service_.Shutdown();
  620. server_->Shutdown(grpc_timeout_milliseconds_to_deadline(0));
  621. thread_->join();
  622. gpr_log(GPR_INFO, "%s shutdown completed", type_.c_str());
  623. running_ = false;
  624. }
  625. const int port_;
  626. std::string type_;
  627. T service_;
  628. std::unique_ptr<Server> server_;
  629. std::unique_ptr<std::thread> thread_;
  630. bool running_ = false;
  631. };
  632. const std::string server_host_;
  633. const size_t num_backends_;
  634. const size_t num_balancers_;
  635. const int client_load_reporting_interval_seconds_;
  636. bool ipv6_only_ = false;
  637. std::shared_ptr<Channel> channel_;
  638. std::unique_ptr<grpc::testing::EchoTestService::Stub> stub_;
  639. std::vector<std::unique_ptr<ServerThread<BackendServiceImpl>>> backends_;
  640. std::vector<std::unique_ptr<ServerThread<BalancerServiceImpl>>> balancers_;
  641. grpc_core::RefCountedPtr<grpc_core::FakeResolverResponseGenerator>
  642. response_generator_;
  643. const std::string kRequestMessage_ = "Live long and prosper.";
  644. const std::string kApplicationTargetName_ = "application_target_name";
  645. };
  646. class SingleBalancerTest : public GrpclbEnd2endTest {
  647. public:
  648. SingleBalancerTest() : GrpclbEnd2endTest(4, 1, 0) {}
  649. };
  650. TEST_F(SingleBalancerTest, Vanilla) {
  651. SetNextResolutionAllBalancers();
  652. const size_t kNumRpcsPerAddress = 100;
  653. ScheduleResponseForBalancer(
  654. 0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
  655. // Make sure that trying to connect works without a call.
  656. channel_->GetState(true /* try_to_connect */);
  657. // We need to wait for all backends to come online.
  658. WaitForAllBackends();
  659. // Send kNumRpcsPerAddress RPCs per server.
  660. CheckRpcSendOk(kNumRpcsPerAddress * num_backends_);
  661. // Each backend should have gotten 100 requests.
  662. for (size_t i = 0; i < backends_.size(); ++i) {
  663. EXPECT_EQ(kNumRpcsPerAddress, backends_[i]->service_.request_count());
  664. }
  665. balancers_[0]->service_.NotifyDoneWithServerlists();
  666. // The balancer got a single request.
  667. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  668. // and sent a single response.
  669. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  670. // Check LB policy name for the channel.
  671. EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName());
  672. }
  673. TEST_F(SingleBalancerTest, SubchannelCaching) {
  674. ResetStub(/*fallback_timeout=*/0, /*expected_targets=*/"",
  675. /*subchannel_cache_delay_ms=*/1500);
  676. SetNextResolutionAllBalancers();
  677. // Initially send all backends.
  678. ScheduleResponseForBalancer(
  679. 0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
  680. // Then remove backends 0 and 1.
  681. ScheduleResponseForBalancer(
  682. 0, BuildResponseForBackends(GetBackendPorts(2), {}), 1000);
  683. // Now re-add backend 1.
  684. ScheduleResponseForBalancer(
  685. 0, BuildResponseForBackends(GetBackendPorts(1), {}), 1000);
  686. // Wait for all backends to come online.
  687. WaitForAllBackends();
  688. // Send RPCs for long enough to get all responses.
  689. gpr_timespec deadline = grpc_timeout_milliseconds_to_deadline(3000);
  690. do {
  691. CheckRpcSendOk();
  692. } while (gpr_time_cmp(gpr_now(GPR_CLOCK_MONOTONIC), deadline) < 0);
  693. // Backend 0 should have received less traffic than the others.
  694. // Backend 1 would have received less traffic than 2 and 3.
  695. gpr_log(GPR_INFO, "BACKEND 0: %" PRIuPTR " requests",
  696. backends_[0]->service_.request_count());
  697. EXPECT_GT(backends_[0]->service_.request_count(), 0);
  698. for (size_t i = 1; i < backends_.size(); ++i) {
  699. gpr_log(GPR_INFO, "BACKEND %" PRIuPTR ": %" PRIuPTR " requests", i,
  700. backends_[i]->service_.request_count());
  701. EXPECT_GT(backends_[i]->service_.request_count(),
  702. backends_[0]->service_.request_count())
  703. << "backend " << i;
  704. if (i >= 2) {
  705. EXPECT_GT(backends_[i]->service_.request_count(),
  706. backends_[1]->service_.request_count())
  707. << "backend " << i;
  708. }
  709. }
  710. // Backend 1 should never have lost its connection from the client.
  711. EXPECT_EQ(1UL, backends_[1]->service_.clients().size());
  712. balancers_[0]->service_.NotifyDoneWithServerlists();
  713. // The balancer got a single request.
  714. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  715. // And sent 3 responses.
  716. EXPECT_EQ(3U, balancers_[0]->service_.response_count());
  717. }
  718. TEST_F(SingleBalancerTest, ReturnServerStatus) {
  719. SetNextResolutionAllBalancers();
  720. ScheduleResponseForBalancer(
  721. 0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
  722. // We need to wait for all backends to come online.
  723. WaitForAllBackends();
  724. // Send a request that the backend will fail, and make sure we get
  725. // back the right status.
  726. Status expected(StatusCode::INVALID_ARGUMENT, "He's dead, Jim!");
  727. Status actual = SendRpc(/*response=*/nullptr, /*timeout_ms=*/1000,
  728. /*wait_for_ready=*/false, expected);
  729. EXPECT_EQ(actual.error_code(), expected.error_code());
  730. EXPECT_EQ(actual.error_message(), expected.error_message());
  731. }
  732. TEST_F(SingleBalancerTest, SelectGrpclbWithMigrationServiceConfig) {
  733. SetNextResolutionAllBalancers(
  734. "{\n"
  735. " \"loadBalancingConfig\":[\n"
  736. " { \"does_not_exist\":{} },\n"
  737. " { \"grpclb\":{} }\n"
  738. " ]\n"
  739. "}");
  740. ScheduleResponseForBalancer(
  741. 0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
  742. CheckRpcSendOk(1, 1000 /* timeout_ms */, true /* wait_for_ready */);
  743. balancers_[0]->service_.NotifyDoneWithServerlists();
  744. // The balancer got a single request.
  745. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  746. // and sent a single response.
  747. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  748. // Check LB policy name for the channel.
  749. EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName());
  750. }
  751. TEST_F(SingleBalancerTest,
  752. SelectGrpclbWithMigrationServiceConfigAndNoAddresses) {
  753. const int kFallbackTimeoutMs = 200 * grpc_test_slowdown_factor();
  754. ResetStub(kFallbackTimeoutMs);
  755. SetNextResolution({}, {},
  756. "{\n"
  757. " \"loadBalancingConfig\":[\n"
  758. " { \"does_not_exist\":{} },\n"
  759. " { \"grpclb\":{} }\n"
  760. " ]\n"
  761. "}");
  762. // Try to connect.
  763. EXPECT_EQ(GRPC_CHANNEL_IDLE, channel_->GetState(true));
  764. // Should go into state TRANSIENT_FAILURE when we enter fallback mode.
  765. const gpr_timespec deadline = grpc_timeout_seconds_to_deadline(1);
  766. grpc_connectivity_state state;
  767. while ((state = channel_->GetState(false)) !=
  768. GRPC_CHANNEL_TRANSIENT_FAILURE) {
  769. ASSERT_TRUE(channel_->WaitForStateChange(state, deadline));
  770. }
  771. // Check LB policy name for the channel.
  772. EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName());
  773. }
  774. TEST_F(SingleBalancerTest, UsePickFirstChildPolicy) {
  775. SetNextResolutionAllBalancers(
  776. "{\n"
  777. " \"loadBalancingConfig\":[\n"
  778. " { \"grpclb\":{\n"
  779. " \"childPolicy\":[\n"
  780. " { \"pick_first\":{} }\n"
  781. " ]\n"
  782. " } }\n"
  783. " ]\n"
  784. "}");
  785. ScheduleResponseForBalancer(
  786. 0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
  787. const size_t kNumRpcs = num_backends_ * 2;
  788. CheckRpcSendOk(kNumRpcs, 1000 /* timeout_ms */, true /* wait_for_ready */);
  789. balancers_[0]->service_.NotifyDoneWithServerlists();
  790. // Check that all requests went to the first backend. This verifies
  791. // that we used pick_first instead of round_robin as the child policy.
  792. EXPECT_EQ(backends_[0]->service_.request_count(), kNumRpcs);
  793. for (size_t i = 1; i < backends_.size(); ++i) {
  794. EXPECT_EQ(backends_[i]->service_.request_count(), 0UL);
  795. }
  796. // The balancer got a single request.
  797. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  798. // and sent a single response.
  799. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  800. // Check LB policy name for the channel.
  801. EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName());
  802. }
  803. TEST_F(SingleBalancerTest, SwapChildPolicy) {
  804. SetNextResolutionAllBalancers(
  805. "{\n"
  806. " \"loadBalancingConfig\":[\n"
  807. " { \"grpclb\":{\n"
  808. " \"childPolicy\":[\n"
  809. " { \"pick_first\":{} }\n"
  810. " ]\n"
  811. " } }\n"
  812. " ]\n"
  813. "}");
  814. ScheduleResponseForBalancer(
  815. 0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
  816. const size_t kNumRpcs = num_backends_ * 2;
  817. CheckRpcSendOk(kNumRpcs, 1000 /* timeout_ms */, true /* wait_for_ready */);
  818. // Check that all requests went to the first backend. This verifies
  819. // that we used pick_first instead of round_robin as the child policy.
  820. EXPECT_EQ(backends_[0]->service_.request_count(), kNumRpcs);
  821. for (size_t i = 1; i < backends_.size(); ++i) {
  822. EXPECT_EQ(backends_[i]->service_.request_count(), 0UL);
  823. }
  824. // Send new resolution that removes child policy from service config.
  825. SetNextResolutionAllBalancers();
  826. WaitForAllBackends();
  827. CheckRpcSendOk(kNumRpcs, 1000 /* timeout_ms */, true /* wait_for_ready */);
  828. // Check that every backend saw the same number of requests. This verifies
  829. // that we used round_robin.
  830. for (size_t i = 0; i < backends_.size(); ++i) {
  831. EXPECT_EQ(backends_[i]->service_.request_count(), 2UL);
  832. }
  833. // Done.
  834. balancers_[0]->service_.NotifyDoneWithServerlists();
  835. // The balancer got a single request.
  836. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  837. // and sent a single response.
  838. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  839. // Check LB policy name for the channel.
  840. EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName());
  841. }
  842. TEST_F(SingleBalancerTest, SameBackendListedMultipleTimes) {
  843. SetNextResolutionAllBalancers();
  844. // Same backend listed twice.
  845. std::vector<int> ports;
  846. ports.push_back(backends_[0]->port_);
  847. ports.push_back(backends_[0]->port_);
  848. const size_t kNumRpcsPerAddress = 10;
  849. ScheduleResponseForBalancer(0, BuildResponseForBackends(ports, {}), 0);
  850. // We need to wait for the backend to come online.
  851. WaitForBackend(0);
  852. // Send kNumRpcsPerAddress RPCs per server.
  853. CheckRpcSendOk(kNumRpcsPerAddress * ports.size());
  854. // Backend should have gotten 20 requests.
  855. EXPECT_EQ(kNumRpcsPerAddress * 2, backends_[0]->service_.request_count());
  856. // And they should have come from a single client port, because of
  857. // subchannel sharing.
  858. EXPECT_EQ(1UL, backends_[0]->service_.clients().size());
  859. balancers_[0]->service_.NotifyDoneWithServerlists();
  860. }
  861. TEST_F(SingleBalancerTest, SecureNaming) {
  862. ResetStub(0, kApplicationTargetName_ + ";lb");
  863. SetNextResolution({AddressData{balancers_[0]->port_, "lb"}});
  864. const size_t kNumRpcsPerAddress = 100;
  865. ScheduleResponseForBalancer(
  866. 0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
  867. // Make sure that trying to connect works without a call.
  868. channel_->GetState(true /* try_to_connect */);
  869. // We need to wait for all backends to come online.
  870. WaitForAllBackends();
  871. // Send kNumRpcsPerAddress RPCs per server.
  872. CheckRpcSendOk(kNumRpcsPerAddress * num_backends_);
  873. // Each backend should have gotten 100 requests.
  874. for (size_t i = 0; i < backends_.size(); ++i) {
  875. EXPECT_EQ(kNumRpcsPerAddress, backends_[i]->service_.request_count());
  876. }
  877. balancers_[0]->service_.NotifyDoneWithServerlists();
  878. // The balancer got a single request.
  879. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  880. // and sent a single response.
  881. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  882. // Check LB policy name for the channel.
  883. EXPECT_EQ("grpclb", channel_->GetLoadBalancingPolicyName());
  884. }
  885. TEST_F(SingleBalancerTest, SecureNamingDeathTest) {
  886. GTEST_FLAG_SET(death_test_style, "threadsafe");
  887. // Make sure that we blow up (via abort() from the security connector) when
  888. // the name from the balancer doesn't match expectations.
  889. ASSERT_DEATH_IF_SUPPORTED(
  890. {
  891. ResetStub(0, kApplicationTargetName_ + ";lb");
  892. SetNextResolution({AddressData{balancers_[0]->port_, "woops"}});
  893. channel_->WaitForConnected(grpc_timeout_seconds_to_deadline(1));
  894. },
  895. "");
  896. }
  897. TEST_F(SingleBalancerTest, InitiallyEmptyServerlist) {
  898. SetNextResolutionAllBalancers();
  899. const int kServerlistDelayMs = 500 * grpc_test_slowdown_factor();
  900. const int kCallDeadlineMs = kServerlistDelayMs * 2;
  901. // First response is an empty serverlist, sent right away.
  902. ScheduleResponseForBalancer(0, LoadBalanceResponse(), 0);
  903. // Send non-empty serverlist only after kServerlistDelayMs
  904. ScheduleResponseForBalancer(
  905. 0, BuildResponseForBackends(GetBackendPorts(), {}), kServerlistDelayMs);
  906. const auto t0 = system_clock::now();
  907. // Client will block: LB will initially send empty serverlist.
  908. CheckRpcSendOk(1, kCallDeadlineMs, true /* wait_for_ready */);
  909. const auto ellapsed_ms =
  910. std::chrono::duration_cast<std::chrono::milliseconds>(
  911. system_clock::now() - t0);
  912. // but eventually, the LB sends a serverlist update that allows the call to
  913. // proceed. The call delay must be larger than the delay in sending the
  914. // populated serverlist but under the call's deadline (which is enforced by
  915. // the call's deadline).
  916. EXPECT_GT(ellapsed_ms.count(), kServerlistDelayMs);
  917. balancers_[0]->service_.NotifyDoneWithServerlists();
  918. // The balancer got a single request.
  919. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  920. // and sent two responses.
  921. EXPECT_EQ(2U, balancers_[0]->service_.response_count());
  922. }
  923. TEST_F(SingleBalancerTest, AllServersUnreachableFailFast) {
  924. SetNextResolutionAllBalancers();
  925. const size_t kNumUnreachableServers = 5;
  926. std::vector<int> ports;
  927. for (size_t i = 0; i < kNumUnreachableServers; ++i) {
  928. ports.push_back(grpc_pick_unused_port_or_die());
  929. }
  930. ScheduleResponseForBalancer(0, BuildResponseForBackends(ports, {}), 0);
  931. const Status status = SendRpc();
  932. // The error shouldn't be DEADLINE_EXCEEDED.
  933. EXPECT_EQ(StatusCode::UNAVAILABLE, status.error_code());
  934. balancers_[0]->service_.NotifyDoneWithServerlists();
  935. // The balancer got a single request.
  936. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  937. // and sent a single response.
  938. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  939. }
  940. TEST_F(SingleBalancerTest, Fallback) {
  941. SetNextResolutionAllBalancers();
  942. const int kFallbackTimeoutMs = 200 * grpc_test_slowdown_factor();
  943. const int kServerlistDelayMs = 500 * grpc_test_slowdown_factor();
  944. const size_t kNumBackendsInResolution = backends_.size() / 2;
  945. ResetStub(kFallbackTimeoutMs);
  946. std::vector<AddressData> balancer_addresses;
  947. balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""});
  948. std::vector<AddressData> backend_addresses;
  949. for (size_t i = 0; i < kNumBackendsInResolution; ++i) {
  950. backend_addresses.emplace_back(AddressData{backends_[i]->port_, ""});
  951. }
  952. SetNextResolution(balancer_addresses, backend_addresses);
  953. // Send non-empty serverlist only after kServerlistDelayMs.
  954. ScheduleResponseForBalancer(
  955. 0,
  956. BuildResponseForBackends(
  957. GetBackendPorts(kNumBackendsInResolution /* start_index */), {}),
  958. kServerlistDelayMs);
  959. // Wait until all the fallback backends are reachable.
  960. for (size_t i = 0; i < kNumBackendsInResolution; ++i) {
  961. WaitForBackend(i);
  962. }
  963. // The first request.
  964. gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH ==========");
  965. CheckRpcSendOk(kNumBackendsInResolution);
  966. gpr_log(GPR_INFO, "========= DONE WITH FIRST BATCH ==========");
  967. // Fallback is used: each backend returned by the resolver should have
  968. // gotten one request.
  969. for (size_t i = 0; i < kNumBackendsInResolution; ++i) {
  970. EXPECT_EQ(1U, backends_[i]->service_.request_count());
  971. }
  972. for (size_t i = kNumBackendsInResolution; i < backends_.size(); ++i) {
  973. EXPECT_EQ(0U, backends_[i]->service_.request_count());
  974. }
  975. // Wait until the serverlist reception has been processed and all backends
  976. // in the serverlist are reachable.
  977. for (size_t i = kNumBackendsInResolution; i < backends_.size(); ++i) {
  978. WaitForBackend(i);
  979. }
  980. // Send out the second request.
  981. gpr_log(GPR_INFO, "========= BEFORE SECOND BATCH ==========");
  982. CheckRpcSendOk(backends_.size() - kNumBackendsInResolution);
  983. gpr_log(GPR_INFO, "========= DONE WITH SECOND BATCH ==========");
  984. // Serverlist is used: each backend returned by the balancer should
  985. // have gotten one request.
  986. for (size_t i = 0; i < kNumBackendsInResolution; ++i) {
  987. EXPECT_EQ(0U, backends_[i]->service_.request_count());
  988. }
  989. for (size_t i = kNumBackendsInResolution; i < backends_.size(); ++i) {
  990. EXPECT_EQ(1U, backends_[i]->service_.request_count());
  991. }
  992. balancers_[0]->service_.NotifyDoneWithServerlists();
  993. // The balancer got a single request.
  994. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  995. // and sent a single response.
  996. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  997. }
  998. TEST_F(SingleBalancerTest, FallbackUpdate) {
  999. SetNextResolutionAllBalancers();
  1000. const int kFallbackTimeoutMs = 200 * grpc_test_slowdown_factor();
  1001. const int kServerlistDelayMs = 500 * grpc_test_slowdown_factor();
  1002. const size_t kNumBackendsInResolution = backends_.size() / 3;
  1003. const size_t kNumBackendsInResolutionUpdate = backends_.size() / 3;
  1004. ResetStub(kFallbackTimeoutMs);
  1005. std::vector<AddressData> balancer_addresses;
  1006. balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""});
  1007. std::vector<AddressData> backend_addresses;
  1008. for (size_t i = 0; i < kNumBackendsInResolution; ++i) {
  1009. backend_addresses.emplace_back(AddressData{backends_[i]->port_, ""});
  1010. }
  1011. SetNextResolution(balancer_addresses, backend_addresses);
  1012. // Send non-empty serverlist only after kServerlistDelayMs.
  1013. ScheduleResponseForBalancer(
  1014. 0,
  1015. BuildResponseForBackends(
  1016. GetBackendPorts(kNumBackendsInResolution +
  1017. kNumBackendsInResolutionUpdate /* start_index */),
  1018. {}),
  1019. kServerlistDelayMs);
  1020. // Wait until all the fallback backends are reachable.
  1021. for (size_t i = 0; i < kNumBackendsInResolution; ++i) {
  1022. WaitForBackend(i);
  1023. }
  1024. // The first request.
  1025. gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH ==========");
  1026. CheckRpcSendOk(kNumBackendsInResolution);
  1027. gpr_log(GPR_INFO, "========= DONE WITH FIRST BATCH ==========");
  1028. // Fallback is used: each backend returned by the resolver should have
  1029. // gotten one request.
  1030. for (size_t i = 0; i < kNumBackendsInResolution; ++i) {
  1031. EXPECT_EQ(1U, backends_[i]->service_.request_count());
  1032. }
  1033. for (size_t i = kNumBackendsInResolution; i < backends_.size(); ++i) {
  1034. EXPECT_EQ(0U, backends_[i]->service_.request_count());
  1035. }
  1036. balancer_addresses.clear();
  1037. balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""});
  1038. backend_addresses.clear();
  1039. for (size_t i = kNumBackendsInResolution;
  1040. i < kNumBackendsInResolution + kNumBackendsInResolutionUpdate; ++i) {
  1041. backend_addresses.emplace_back(AddressData{backends_[i]->port_, ""});
  1042. }
  1043. SetNextResolution(balancer_addresses, backend_addresses);
  1044. // Wait until the resolution update has been processed and all the new
  1045. // fallback backends are reachable.
  1046. for (size_t i = kNumBackendsInResolution;
  1047. i < kNumBackendsInResolution + kNumBackendsInResolutionUpdate; ++i) {
  1048. WaitForBackend(i);
  1049. }
  1050. // Send out the second request.
  1051. gpr_log(GPR_INFO, "========= BEFORE SECOND BATCH ==========");
  1052. CheckRpcSendOk(kNumBackendsInResolutionUpdate);
  1053. gpr_log(GPR_INFO, "========= DONE WITH SECOND BATCH ==========");
  1054. // The resolution update is used: each backend in the resolution update should
  1055. // have gotten one request.
  1056. for (size_t i = 0; i < kNumBackendsInResolution; ++i) {
  1057. EXPECT_EQ(0U, backends_[i]->service_.request_count());
  1058. }
  1059. for (size_t i = kNumBackendsInResolution;
  1060. i < kNumBackendsInResolution + kNumBackendsInResolutionUpdate; ++i) {
  1061. EXPECT_EQ(1U, backends_[i]->service_.request_count());
  1062. }
  1063. for (size_t i = kNumBackendsInResolution + kNumBackendsInResolutionUpdate;
  1064. i < backends_.size(); ++i) {
  1065. EXPECT_EQ(0U, backends_[i]->service_.request_count());
  1066. }
  1067. // Wait until the serverlist reception has been processed and all backends
  1068. // in the serverlist are reachable.
  1069. for (size_t i = kNumBackendsInResolution + kNumBackendsInResolutionUpdate;
  1070. i < backends_.size(); ++i) {
  1071. WaitForBackend(i);
  1072. }
  1073. // Send out the third request.
  1074. gpr_log(GPR_INFO, "========= BEFORE THIRD BATCH ==========");
  1075. CheckRpcSendOk(backends_.size() - kNumBackendsInResolution -
  1076. kNumBackendsInResolutionUpdate);
  1077. gpr_log(GPR_INFO, "========= DONE WITH THIRD BATCH ==========");
  1078. // Serverlist is used: each backend returned by the balancer should
  1079. // have gotten one request.
  1080. for (size_t i = 0;
  1081. i < kNumBackendsInResolution + kNumBackendsInResolutionUpdate; ++i) {
  1082. EXPECT_EQ(0U, backends_[i]->service_.request_count());
  1083. }
  1084. for (size_t i = kNumBackendsInResolution + kNumBackendsInResolutionUpdate;
  1085. i < backends_.size(); ++i) {
  1086. EXPECT_EQ(1U, backends_[i]->service_.request_count());
  1087. }
  1088. balancers_[0]->service_.NotifyDoneWithServerlists();
  1089. // The balancer got a single request.
  1090. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  1091. // and sent a single response.
  1092. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  1093. }
  1094. TEST_F(SingleBalancerTest,
  1095. FallbackAfterStartup_LoseContactWithBalancerThenBackends) {
  1096. // First two backends are fallback, last two are pointed to by balancer.
  1097. const size_t kNumFallbackBackends = 2;
  1098. const size_t kNumBalancerBackends = backends_.size() - kNumFallbackBackends;
  1099. std::vector<AddressData> backend_addresses;
  1100. for (size_t i = 0; i < kNumFallbackBackends; ++i) {
  1101. backend_addresses.emplace_back(AddressData{backends_[i]->port_, ""});
  1102. }
  1103. std::vector<AddressData> balancer_addresses;
  1104. for (size_t i = 0; i < balancers_.size(); ++i) {
  1105. balancer_addresses.emplace_back(AddressData{balancers_[i]->port_, ""});
  1106. }
  1107. SetNextResolution(balancer_addresses, backend_addresses);
  1108. ScheduleResponseForBalancer(
  1109. 0, BuildResponseForBackends(GetBackendPorts(kNumFallbackBackends), {}),
  1110. 0);
  1111. // Try to connect.
  1112. channel_->GetState(true /* try_to_connect */);
  1113. WaitForAllBackends(1 /* num_requests_multiple_of */,
  1114. kNumFallbackBackends /* start_index */);
  1115. // Stop balancer. RPCs should continue going to backends from balancer.
  1116. balancers_[0]->Shutdown();
  1117. CheckRpcSendOk(100 * kNumBalancerBackends);
  1118. for (size_t i = kNumFallbackBackends; i < backends_.size(); ++i) {
  1119. EXPECT_EQ(100UL, backends_[i]->service_.request_count());
  1120. }
  1121. // Stop backends from balancer. This should put us in fallback mode.
  1122. for (size_t i = kNumFallbackBackends; i < backends_.size(); ++i) {
  1123. ShutdownBackend(i);
  1124. }
  1125. WaitForAllBackends(1 /* num_requests_multiple_of */, 0 /* start_index */,
  1126. kNumFallbackBackends /* stop_index */);
  1127. // Restart the backends from the balancer. We should *not* start
  1128. // sending traffic back to them at this point (although the behavior
  1129. // in xds may be different).
  1130. for (size_t i = kNumFallbackBackends; i < backends_.size(); ++i) {
  1131. StartBackend(i);
  1132. }
  1133. CheckRpcSendOk(100 * kNumBalancerBackends);
  1134. for (size_t i = 0; i < kNumFallbackBackends; ++i) {
  1135. EXPECT_EQ(100UL, backends_[i]->service_.request_count());
  1136. }
  1137. // Now start the balancer again. This should cause us to exit
  1138. // fallback mode.
  1139. balancers_[0]->Start(server_host_);
  1140. ScheduleResponseForBalancer(
  1141. 0, BuildResponseForBackends(GetBackendPorts(kNumFallbackBackends), {}),
  1142. 0);
  1143. WaitForAllBackends(1 /* num_requests_multiple_of */,
  1144. kNumFallbackBackends /* start_index */);
  1145. }
  1146. TEST_F(SingleBalancerTest,
  1147. FallbackAfterStartup_LoseContactWithBackendsThenBalancer) {
  1148. // First two backends are fallback, last two are pointed to by balancer.
  1149. const size_t kNumFallbackBackends = 2;
  1150. const size_t kNumBalancerBackends = backends_.size() - kNumFallbackBackends;
  1151. std::vector<AddressData> backend_addresses;
  1152. for (size_t i = 0; i < kNumFallbackBackends; ++i) {
  1153. backend_addresses.emplace_back(AddressData{backends_[i]->port_, ""});
  1154. }
  1155. std::vector<AddressData> balancer_addresses;
  1156. for (size_t i = 0; i < balancers_.size(); ++i) {
  1157. balancer_addresses.emplace_back(AddressData{balancers_[i]->port_, ""});
  1158. }
  1159. SetNextResolution(balancer_addresses, backend_addresses);
  1160. ScheduleResponseForBalancer(
  1161. 0, BuildResponseForBackends(GetBackendPorts(kNumFallbackBackends), {}),
  1162. 0);
  1163. // Try to connect.
  1164. channel_->GetState(true /* try_to_connect */);
  1165. WaitForAllBackends(1 /* num_requests_multiple_of */,
  1166. kNumFallbackBackends /* start_index */);
  1167. // Stop backends from balancer. Since we are still in contact with
  1168. // the balancer at this point, RPCs should be failing.
  1169. for (size_t i = kNumFallbackBackends; i < backends_.size(); ++i) {
  1170. ShutdownBackend(i);
  1171. }
  1172. CheckRpcSendFailure();
  1173. // Stop balancer. This should put us in fallback mode.
  1174. balancers_[0]->Shutdown();
  1175. WaitForAllBackends(1 /* num_requests_multiple_of */, 0 /* start_index */,
  1176. kNumFallbackBackends /* stop_index */);
  1177. // Restart the backends from the balancer. We should *not* start
  1178. // sending traffic back to them at this point (although the behavior
  1179. // in xds may be different).
  1180. for (size_t i = kNumFallbackBackends; i < backends_.size(); ++i) {
  1181. StartBackend(i);
  1182. }
  1183. CheckRpcSendOk(100 * kNumBalancerBackends);
  1184. for (size_t i = 0; i < kNumFallbackBackends; ++i) {
  1185. EXPECT_EQ(100UL, backends_[i]->service_.request_count());
  1186. }
  1187. // Now start the balancer again. This should cause us to exit
  1188. // fallback mode.
  1189. balancers_[0]->Start(server_host_);
  1190. ScheduleResponseForBalancer(
  1191. 0, BuildResponseForBackends(GetBackendPorts(kNumFallbackBackends), {}),
  1192. 0);
  1193. WaitForAllBackends(1 /* num_requests_multiple_of */,
  1194. kNumFallbackBackends /* start_index */);
  1195. }
  1196. TEST_F(SingleBalancerTest, FallbackEarlyWhenBalancerChannelFails) {
  1197. const int kFallbackTimeoutMs = 10000 * grpc_test_slowdown_factor();
  1198. ResetStub(kFallbackTimeoutMs);
  1199. // Return an unreachable balancer and one fallback backend.
  1200. std::vector<AddressData> balancer_addresses;
  1201. balancer_addresses.emplace_back(
  1202. AddressData{grpc_pick_unused_port_or_die(), ""});
  1203. std::vector<AddressData> backend_addresses;
  1204. backend_addresses.emplace_back(AddressData{backends_[0]->port_, ""});
  1205. SetNextResolution(balancer_addresses, backend_addresses);
  1206. // Send RPC with deadline less than the fallback timeout and make sure it
  1207. // succeeds.
  1208. CheckRpcSendOk(/* times */ 1, /* timeout_ms */ 1000,
  1209. /* wait_for_ready */ false);
  1210. }
  1211. TEST_F(SingleBalancerTest, FallbackEarlyWhenBalancerCallFails) {
  1212. const int kFallbackTimeoutMs = 10000 * grpc_test_slowdown_factor();
  1213. ResetStub(kFallbackTimeoutMs);
  1214. // Return one balancer and one fallback backend.
  1215. std::vector<AddressData> balancer_addresses;
  1216. balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""});
  1217. std::vector<AddressData> backend_addresses;
  1218. backend_addresses.emplace_back(AddressData{backends_[0]->port_, ""});
  1219. SetNextResolution(balancer_addresses, backend_addresses);
  1220. // Balancer drops call without sending a serverlist.
  1221. balancers_[0]->service_.NotifyDoneWithServerlists();
  1222. // Send RPC with deadline less than the fallback timeout and make sure it
  1223. // succeeds.
  1224. CheckRpcSendOk(/* times */ 1, /* timeout_ms */ 1000,
  1225. /* wait_for_ready */ false);
  1226. }
  1227. TEST_F(SingleBalancerTest, FallbackControlledByBalancer_BeforeFirstServerlist) {
  1228. const int kFallbackTimeoutMs = 10000 * grpc_test_slowdown_factor();
  1229. ResetStub(kFallbackTimeoutMs);
  1230. // Return one balancer and one fallback backend.
  1231. std::vector<AddressData> balancer_addresses;
  1232. balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""});
  1233. std::vector<AddressData> backend_addresses;
  1234. backend_addresses.emplace_back(AddressData{backends_[0]->port_, ""});
  1235. SetNextResolution(balancer_addresses, backend_addresses);
  1236. // Balancer explicitly tells client to fallback.
  1237. LoadBalanceResponse resp;
  1238. resp.mutable_fallback_response();
  1239. ScheduleResponseForBalancer(0, resp, 0);
  1240. // Send RPC with deadline less than the fallback timeout and make sure it
  1241. // succeeds.
  1242. CheckRpcSendOk(/* times */ 1, /* timeout_ms */ 1000,
  1243. /* wait_for_ready */ false);
  1244. }
  1245. TEST_F(SingleBalancerTest, FallbackControlledByBalancer_AfterFirstServerlist) {
  1246. // Return one balancer and one fallback backend (backend 0).
  1247. std::vector<AddressData> balancer_addresses;
  1248. balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""});
  1249. std::vector<AddressData> backend_addresses;
  1250. backend_addresses.emplace_back(AddressData{backends_[0]->port_, ""});
  1251. SetNextResolution(balancer_addresses, backend_addresses);
  1252. // Balancer initially sends serverlist, then tells client to fall back,
  1253. // then sends the serverlist again.
  1254. // The serverlist points to backend 1.
  1255. LoadBalanceResponse serverlist_resp =
  1256. BuildResponseForBackends({backends_[1]->port_}, {});
  1257. LoadBalanceResponse fallback_resp;
  1258. fallback_resp.mutable_fallback_response();
  1259. ScheduleResponseForBalancer(0, serverlist_resp, 0);
  1260. ScheduleResponseForBalancer(0, fallback_resp, 100);
  1261. ScheduleResponseForBalancer(0, serverlist_resp, 100);
  1262. // Requests initially go to backend 1, then go to backend 0 in
  1263. // fallback mode, then go back to backend 1 when we exit fallback.
  1264. WaitForBackend(1);
  1265. WaitForBackend(0);
  1266. WaitForBackend(1);
  1267. }
  1268. TEST_F(SingleBalancerTest, BackendsRestart) {
  1269. SetNextResolutionAllBalancers();
  1270. const size_t kNumRpcsPerAddress = 100;
  1271. ScheduleResponseForBalancer(
  1272. 0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
  1273. // Make sure that trying to connect works without a call.
  1274. channel_->GetState(true /* try_to_connect */);
  1275. // Send kNumRpcsPerAddress RPCs per server.
  1276. CheckRpcSendOk(kNumRpcsPerAddress * num_backends_);
  1277. // Stop backends. RPCs should fail.
  1278. ShutdownAllBackends();
  1279. CheckRpcSendFailure();
  1280. // Restart backends. RPCs should start succeeding again.
  1281. StartAllBackends();
  1282. CheckRpcSendOk(1 /* times */, 2000 /* timeout_ms */,
  1283. true /* wait_for_ready */);
  1284. // The balancer got a single request.
  1285. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  1286. // and sent a single response.
  1287. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  1288. }
  1289. TEST_F(SingleBalancerTest, ServiceNameFromLbPolicyConfig) {
  1290. constexpr char kServiceConfigWithTarget[] =
  1291. "{\n"
  1292. " \"loadBalancingConfig\":[\n"
  1293. " { \"grpclb\":{\n"
  1294. " \"serviceName\":\"test_service\"\n"
  1295. " }}\n"
  1296. " ]\n"
  1297. "}";
  1298. SetNextResolutionAllBalancers(kServiceConfigWithTarget);
  1299. ScheduleResponseForBalancer(
  1300. 0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
  1301. // Make sure that trying to connect works without a call.
  1302. channel_->GetState(true /* try_to_connect */);
  1303. // We need to wait for all backends to come online.
  1304. WaitForAllBackends();
  1305. EXPECT_EQ(balancers_[0]->service_.service_names().back(), "test_service");
  1306. }
  1307. class UpdatesTest : public GrpclbEnd2endTest {
  1308. public:
  1309. UpdatesTest() : GrpclbEnd2endTest(4, 3, 0) {}
  1310. };
  1311. TEST_F(UpdatesTest, UpdateBalancersButKeepUsingOriginalBalancer) {
  1312. SetNextResolutionAllBalancers();
  1313. const std::vector<int> first_backend{GetBackendPorts()[0]};
  1314. const std::vector<int> second_backend{GetBackendPorts()[1]};
  1315. ScheduleResponseForBalancer(0, BuildResponseForBackends(first_backend, {}),
  1316. 0);
  1317. ScheduleResponseForBalancer(1, BuildResponseForBackends(second_backend, {}),
  1318. 0);
  1319. // Wait until the first backend is ready.
  1320. WaitForBackend(0);
  1321. // Send 10 requests.
  1322. gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH ==========");
  1323. CheckRpcSendOk(10);
  1324. gpr_log(GPR_INFO, "========= DONE WITH FIRST BATCH ==========");
  1325. // All 10 requests should have gone to the first backend.
  1326. EXPECT_EQ(10U, backends_[0]->service_.request_count());
  1327. // Balancer 0 got a single request.
  1328. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  1329. // and sent a single response.
  1330. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  1331. EXPECT_EQ(0U, balancers_[1]->service_.request_count());
  1332. EXPECT_EQ(0U, balancers_[1]->service_.response_count());
  1333. EXPECT_EQ(0U, balancers_[2]->service_.request_count());
  1334. EXPECT_EQ(0U, balancers_[2]->service_.response_count());
  1335. std::vector<AddressData> addresses;
  1336. addresses.emplace_back(AddressData{balancers_[1]->port_, ""});
  1337. gpr_log(GPR_INFO, "========= ABOUT TO UPDATE 1 ==========");
  1338. SetNextResolution(addresses);
  1339. gpr_log(GPR_INFO, "========= UPDATE 1 DONE ==========");
  1340. EXPECT_EQ(0U, backends_[1]->service_.request_count());
  1341. gpr_timespec deadline = gpr_time_add(
  1342. gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_millis(10000, GPR_TIMESPAN));
  1343. // Send 10 seconds worth of RPCs
  1344. do {
  1345. CheckRpcSendOk();
  1346. } while (gpr_time_cmp(gpr_now(GPR_CLOCK_REALTIME), deadline) < 0);
  1347. // The current LB call is still working, so grpclb continued using it to the
  1348. // first balancer, which doesn't assign the second backend.
  1349. EXPECT_EQ(0U, backends_[1]->service_.request_count());
  1350. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  1351. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  1352. EXPECT_EQ(0U, balancers_[1]->service_.request_count());
  1353. EXPECT_EQ(0U, balancers_[1]->service_.response_count());
  1354. EXPECT_EQ(0U, balancers_[2]->service_.request_count());
  1355. EXPECT_EQ(0U, balancers_[2]->service_.response_count());
  1356. }
  1357. // Send an update with the same set of LBs as the one in SetUp() in order to
  1358. // verify that the LB channel inside grpclb keeps the initial connection (which
  1359. // by definition is also present in the update).
  1360. TEST_F(UpdatesTest, UpdateBalancersRepeated) {
  1361. SetNextResolutionAllBalancers();
  1362. const std::vector<int> first_backend{GetBackendPorts()[0]};
  1363. const std::vector<int> second_backend{GetBackendPorts()[0]};
  1364. ScheduleResponseForBalancer(0, BuildResponseForBackends(first_backend, {}),
  1365. 0);
  1366. ScheduleResponseForBalancer(1, BuildResponseForBackends(second_backend, {}),
  1367. 0);
  1368. // Wait until the first backend is ready.
  1369. WaitForBackend(0);
  1370. // Send 10 requests.
  1371. gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH ==========");
  1372. CheckRpcSendOk(10);
  1373. gpr_log(GPR_INFO, "========= DONE WITH FIRST BATCH ==========");
  1374. // All 10 requests should have gone to the first backend.
  1375. EXPECT_EQ(10U, backends_[0]->service_.request_count());
  1376. balancers_[0]->service_.NotifyDoneWithServerlists();
  1377. // Balancer 0 got a single request.
  1378. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  1379. // and sent a single response.
  1380. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  1381. EXPECT_EQ(0U, balancers_[1]->service_.request_count());
  1382. EXPECT_EQ(0U, balancers_[1]->service_.response_count());
  1383. EXPECT_EQ(0U, balancers_[2]->service_.request_count());
  1384. EXPECT_EQ(0U, balancers_[2]->service_.response_count());
  1385. std::vector<AddressData> addresses;
  1386. addresses.emplace_back(AddressData{balancers_[0]->port_, ""});
  1387. addresses.emplace_back(AddressData{balancers_[1]->port_, ""});
  1388. addresses.emplace_back(AddressData{balancers_[2]->port_, ""});
  1389. gpr_log(GPR_INFO, "========= ABOUT TO UPDATE 1 ==========");
  1390. SetNextResolution(addresses);
  1391. gpr_log(GPR_INFO, "========= UPDATE 1 DONE ==========");
  1392. EXPECT_EQ(0U, backends_[1]->service_.request_count());
  1393. gpr_timespec deadline = gpr_time_add(
  1394. gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_millis(10000, GPR_TIMESPAN));
  1395. // Send 10 seconds worth of RPCs
  1396. do {
  1397. CheckRpcSendOk();
  1398. } while (gpr_time_cmp(gpr_now(GPR_CLOCK_REALTIME), deadline) < 0);
  1399. // grpclb continued using the original LB call to the first balancer, which
  1400. // doesn't assign the second backend.
  1401. EXPECT_EQ(0U, backends_[1]->service_.request_count());
  1402. balancers_[0]->service_.NotifyDoneWithServerlists();
  1403. addresses.clear();
  1404. addresses.emplace_back(AddressData{balancers_[0]->port_, ""});
  1405. addresses.emplace_back(AddressData{balancers_[1]->port_, ""});
  1406. gpr_log(GPR_INFO, "========= ABOUT TO UPDATE 2 ==========");
  1407. SetNextResolution(addresses);
  1408. gpr_log(GPR_INFO, "========= UPDATE 2 DONE ==========");
  1409. EXPECT_EQ(0U, backends_[1]->service_.request_count());
  1410. deadline = gpr_time_add(gpr_now(GPR_CLOCK_REALTIME),
  1411. gpr_time_from_millis(10000, GPR_TIMESPAN));
  1412. // Send 10 seconds worth of RPCs
  1413. do {
  1414. CheckRpcSendOk();
  1415. } while (gpr_time_cmp(gpr_now(GPR_CLOCK_REALTIME), deadline) < 0);
  1416. // grpclb continued using the original LB call to the first balancer, which
  1417. // doesn't assign the second backend.
  1418. EXPECT_EQ(0U, backends_[1]->service_.request_count());
  1419. balancers_[0]->service_.NotifyDoneWithServerlists();
  1420. }
  1421. TEST_F(UpdatesTest, UpdateBalancersDeadUpdate) {
  1422. std::vector<AddressData> addresses;
  1423. addresses.emplace_back(AddressData{balancers_[0]->port_, ""});
  1424. SetNextResolution(addresses);
  1425. const std::vector<int> first_backend{GetBackendPorts()[0]};
  1426. const std::vector<int> second_backend{GetBackendPorts()[1]};
  1427. ScheduleResponseForBalancer(0, BuildResponseForBackends(first_backend, {}),
  1428. 0);
  1429. ScheduleResponseForBalancer(1, BuildResponseForBackends(second_backend, {}),
  1430. 0);
  1431. // Start servers and send 10 RPCs per server.
  1432. gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH ==========");
  1433. CheckRpcSendOk(10);
  1434. gpr_log(GPR_INFO, "========= DONE WITH FIRST BATCH ==========");
  1435. // All 10 requests should have gone to the first backend.
  1436. EXPECT_EQ(10U, backends_[0]->service_.request_count());
  1437. // Kill balancer 0
  1438. gpr_log(GPR_INFO, "********** ABOUT TO KILL BALANCER 0 *************");
  1439. balancers_[0]->Shutdown();
  1440. gpr_log(GPR_INFO, "********** KILLED BALANCER 0 *************");
  1441. // This is serviced by the existing RR policy
  1442. gpr_log(GPR_INFO, "========= BEFORE SECOND BATCH ==========");
  1443. CheckRpcSendOk(10);
  1444. gpr_log(GPR_INFO, "========= DONE WITH SECOND BATCH ==========");
  1445. // All 10 requests should again have gone to the first backend.
  1446. EXPECT_EQ(20U, backends_[0]->service_.request_count());
  1447. EXPECT_EQ(0U, backends_[1]->service_.request_count());
  1448. // Balancer 0 got a single request.
  1449. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  1450. // and sent a single response.
  1451. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  1452. EXPECT_EQ(0U, balancers_[1]->service_.request_count());
  1453. EXPECT_EQ(0U, balancers_[1]->service_.response_count());
  1454. EXPECT_EQ(0U, balancers_[2]->service_.request_count());
  1455. EXPECT_EQ(0U, balancers_[2]->service_.response_count());
  1456. addresses.clear();
  1457. addresses.emplace_back(AddressData{balancers_[1]->port_, ""});
  1458. gpr_log(GPR_INFO, "========= ABOUT TO UPDATE 1 ==========");
  1459. SetNextResolution(addresses);
  1460. gpr_log(GPR_INFO, "========= UPDATE 1 DONE ==========");
  1461. // Wait until update has been processed, as signaled by the second backend
  1462. // receiving a request. In the meantime, the client continues to be serviced
  1463. // (by the first backend) without interruption.
  1464. EXPECT_EQ(0U, backends_[1]->service_.request_count());
  1465. WaitForBackend(1);
  1466. // This is serviced by the updated RR policy
  1467. backends_[1]->service_.ResetCounters();
  1468. gpr_log(GPR_INFO, "========= BEFORE THIRD BATCH ==========");
  1469. CheckRpcSendOk(10);
  1470. gpr_log(GPR_INFO, "========= DONE WITH THIRD BATCH ==========");
  1471. // All 10 requests should have gone to the second backend.
  1472. EXPECT_EQ(10U, backends_[1]->service_.request_count());
  1473. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  1474. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  1475. // The second balancer, published as part of the first update, may end up
  1476. // getting two requests (that is, 1 <= #req <= 2) if the LB call retry timer
  1477. // firing races with the arrival of the update containing the second
  1478. // balancer.
  1479. EXPECT_GE(balancers_[1]->service_.request_count(), 1U);
  1480. EXPECT_GE(balancers_[1]->service_.response_count(), 1U);
  1481. EXPECT_LE(balancers_[1]->service_.request_count(), 2U);
  1482. EXPECT_LE(balancers_[1]->service_.response_count(), 2U);
  1483. EXPECT_EQ(0U, balancers_[2]->service_.request_count());
  1484. EXPECT_EQ(0U, balancers_[2]->service_.response_count());
  1485. }
  1486. TEST_F(UpdatesTest, ReresolveDeadBackend) {
  1487. ResetStub(500);
  1488. // The first resolution contains the addresses of a balancer that never
  1489. // responds, and a fallback backend.
  1490. std::vector<AddressData> balancer_addresses;
  1491. balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""});
  1492. std::vector<AddressData> backend_addresses;
  1493. backend_addresses.emplace_back(AddressData{backends_[0]->port_, ""});
  1494. SetNextResolution(balancer_addresses, backend_addresses);
  1495. // Ask channel to connect to trigger resolver creation.
  1496. channel_->GetState(true);
  1497. // The re-resolution result will contain the addresses of the same balancer
  1498. // and a new fallback backend.
  1499. balancer_addresses.clear();
  1500. balancer_addresses.emplace_back(AddressData{balancers_[0]->port_, ""});
  1501. backend_addresses.clear();
  1502. backend_addresses.emplace_back(AddressData{backends_[1]->port_, ""});
  1503. SetNextReresolutionResponse(balancer_addresses, backend_addresses);
  1504. // Start servers and send 10 RPCs per server.
  1505. gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH ==========");
  1506. CheckRpcSendOk(10);
  1507. gpr_log(GPR_INFO, "========= DONE WITH FIRST BATCH ==========");
  1508. // All 10 requests should have gone to the fallback backend.
  1509. EXPECT_EQ(10U, backends_[0]->service_.request_count());
  1510. // Kill backend 0.
  1511. gpr_log(GPR_INFO, "********** ABOUT TO KILL BACKEND 0 *************");
  1512. backends_[0]->Shutdown();
  1513. gpr_log(GPR_INFO, "********** KILLED BACKEND 0 *************");
  1514. // Wait until re-resolution has finished, as signaled by the second backend
  1515. // receiving a request.
  1516. WaitForBackend(1);
  1517. gpr_log(GPR_INFO, "========= BEFORE SECOND BATCH ==========");
  1518. CheckRpcSendOk(10);
  1519. gpr_log(GPR_INFO, "========= DONE WITH SECOND BATCH ==========");
  1520. // All 10 requests should have gone to the second backend.
  1521. EXPECT_EQ(10U, backends_[1]->service_.request_count());
  1522. balancers_[0]->service_.NotifyDoneWithServerlists();
  1523. balancers_[1]->service_.NotifyDoneWithServerlists();
  1524. balancers_[2]->service_.NotifyDoneWithServerlists();
  1525. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  1526. EXPECT_EQ(0U, balancers_[0]->service_.response_count());
  1527. EXPECT_EQ(0U, balancers_[1]->service_.request_count());
  1528. EXPECT_EQ(0U, balancers_[1]->service_.response_count());
  1529. EXPECT_EQ(0U, balancers_[2]->service_.request_count());
  1530. EXPECT_EQ(0U, balancers_[2]->service_.response_count());
  1531. }
  1532. // TODO(juanlishen): Should be removed when the first response is always the
  1533. // initial response. Currently, if client load reporting is not enabled, the
  1534. // balancer doesn't send initial response. When the backend shuts down, an
  1535. // unexpected re-resolution will happen. This test configuration is a workaround
  1536. // for test ReresolveDeadBalancer.
  1537. class UpdatesWithClientLoadReportingTest : public GrpclbEnd2endTest {
  1538. public:
  1539. UpdatesWithClientLoadReportingTest() : GrpclbEnd2endTest(4, 3, 2) {}
  1540. };
  1541. TEST_F(UpdatesWithClientLoadReportingTest, ReresolveDeadBalancer) {
  1542. const std::vector<int> first_backend{GetBackendPorts()[0]};
  1543. const std::vector<int> second_backend{GetBackendPorts()[1]};
  1544. ScheduleResponseForBalancer(0, BuildResponseForBackends(first_backend, {}),
  1545. 0);
  1546. ScheduleResponseForBalancer(1, BuildResponseForBackends(second_backend, {}),
  1547. 0);
  1548. // Ask channel to connect to trigger resolver creation.
  1549. channel_->GetState(true);
  1550. std::vector<AddressData> addresses;
  1551. addresses.emplace_back(AddressData{balancers_[0]->port_, ""});
  1552. SetNextResolution(addresses);
  1553. addresses.clear();
  1554. addresses.emplace_back(AddressData{balancers_[1]->port_, ""});
  1555. SetNextReresolutionResponse(addresses);
  1556. // Start servers and send 10 RPCs per server.
  1557. gpr_log(GPR_INFO, "========= BEFORE FIRST BATCH ==========");
  1558. CheckRpcSendOk(10);
  1559. gpr_log(GPR_INFO, "========= DONE WITH FIRST BATCH ==========");
  1560. // All 10 requests should have gone to the first backend.
  1561. EXPECT_EQ(10U, backends_[0]->service_.request_count());
  1562. // Kill backend 0.
  1563. gpr_log(GPR_INFO, "********** ABOUT TO KILL BACKEND 0 *************");
  1564. backends_[0]->Shutdown();
  1565. gpr_log(GPR_INFO, "********** KILLED BACKEND 0 *************");
  1566. CheckRpcSendFailure();
  1567. // Balancer 0 got a single request.
  1568. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  1569. // and sent a single response.
  1570. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  1571. EXPECT_EQ(0U, balancers_[1]->service_.request_count());
  1572. EXPECT_EQ(0U, balancers_[1]->service_.response_count());
  1573. EXPECT_EQ(0U, balancers_[2]->service_.request_count());
  1574. EXPECT_EQ(0U, balancers_[2]->service_.response_count());
  1575. // Kill balancer 0.
  1576. gpr_log(GPR_INFO, "********** ABOUT TO KILL BALANCER 0 *************");
  1577. balancers_[0]->Shutdown();
  1578. gpr_log(GPR_INFO, "********** KILLED BALANCER 0 *************");
  1579. // Wait until re-resolution has finished, as signaled by the second backend
  1580. // receiving a request.
  1581. WaitForBackend(1);
  1582. // This is serviced by the new serverlist.
  1583. gpr_log(GPR_INFO, "========= BEFORE SECOND BATCH ==========");
  1584. CheckRpcSendOk(10);
  1585. gpr_log(GPR_INFO, "========= DONE WITH SECOND BATCH ==========");
  1586. // All 10 requests should have gone to the second backend.
  1587. EXPECT_EQ(10U, backends_[1]->service_.request_count());
  1588. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  1589. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  1590. // After balancer 0 is killed, we restart an LB call immediately (because we
  1591. // disconnect to a previously connected balancer). Although we will cancel
  1592. // this call when the re-resolution update is done and another LB call restart
  1593. // is needed, this old call may still succeed reaching the LB server if
  1594. // re-resolution is slow. So balancer 1 may have received 2 requests and sent
  1595. // 2 responses.
  1596. EXPECT_GE(balancers_[1]->service_.request_count(), 1U);
  1597. EXPECT_GE(balancers_[1]->service_.response_count(), 1U);
  1598. EXPECT_LE(balancers_[1]->service_.request_count(), 2U);
  1599. EXPECT_LE(balancers_[1]->service_.response_count(), 2U);
  1600. EXPECT_EQ(0U, balancers_[2]->service_.request_count());
  1601. EXPECT_EQ(0U, balancers_[2]->service_.response_count());
  1602. }
  1603. TEST_F(SingleBalancerTest, Drop) {
  1604. SetNextResolutionAllBalancers();
  1605. const size_t kNumRpcsPerAddress = 100;
  1606. const int num_of_drop_by_rate_limiting_addresses = 1;
  1607. const int num_of_drop_by_load_balancing_addresses = 2;
  1608. const int num_of_drop_addresses = num_of_drop_by_rate_limiting_addresses +
  1609. num_of_drop_by_load_balancing_addresses;
  1610. const int num_total_addresses = num_backends_ + num_of_drop_addresses;
  1611. ScheduleResponseForBalancer(
  1612. 0,
  1613. BuildResponseForBackends(
  1614. GetBackendPorts(),
  1615. {{"rate_limiting", num_of_drop_by_rate_limiting_addresses},
  1616. {"load_balancing", num_of_drop_by_load_balancing_addresses}}),
  1617. 0);
  1618. // Wait until all backends are ready.
  1619. WaitForAllBackends();
  1620. // Send kNumRpcsPerAddress RPCs for each server and drop address.
  1621. size_t num_drops = 0;
  1622. for (size_t i = 0; i < kNumRpcsPerAddress * num_total_addresses; ++i) {
  1623. EchoResponse response;
  1624. const Status status = SendRpc(&response);
  1625. if (!status.ok() &&
  1626. status.error_message() == "drop directed by grpclb balancer") {
  1627. ++num_drops;
  1628. } else {
  1629. EXPECT_TRUE(status.ok()) << "code=" << status.error_code()
  1630. << " message=" << status.error_message();
  1631. EXPECT_EQ(response.message(), kRequestMessage_);
  1632. }
  1633. }
  1634. EXPECT_EQ(kNumRpcsPerAddress * num_of_drop_addresses, num_drops);
  1635. // Each backend should have gotten 100 requests.
  1636. for (size_t i = 0; i < backends_.size(); ++i) {
  1637. EXPECT_EQ(kNumRpcsPerAddress, backends_[i]->service_.request_count());
  1638. }
  1639. // The balancer got a single request.
  1640. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  1641. // and sent a single response.
  1642. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  1643. }
  1644. TEST_F(SingleBalancerTest, DropAllFirst) {
  1645. SetNextResolutionAllBalancers();
  1646. // All registered addresses are marked as "drop".
  1647. const int num_of_drop_by_rate_limiting_addresses = 1;
  1648. const int num_of_drop_by_load_balancing_addresses = 1;
  1649. ScheduleResponseForBalancer(
  1650. 0,
  1651. BuildResponseForBackends(
  1652. {}, {{"rate_limiting", num_of_drop_by_rate_limiting_addresses},
  1653. {"load_balancing", num_of_drop_by_load_balancing_addresses}}),
  1654. 0);
  1655. const Status status = SendRpc(nullptr, 1000, true);
  1656. EXPECT_FALSE(status.ok());
  1657. EXPECT_EQ(status.error_message(), "drop directed by grpclb balancer");
  1658. }
  1659. TEST_F(SingleBalancerTest, DropAll) {
  1660. SetNextResolutionAllBalancers();
  1661. ScheduleResponseForBalancer(
  1662. 0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
  1663. const int num_of_drop_by_rate_limiting_addresses = 1;
  1664. const int num_of_drop_by_load_balancing_addresses = 1;
  1665. ScheduleResponseForBalancer(
  1666. 0,
  1667. BuildResponseForBackends(
  1668. {}, {{"rate_limiting", num_of_drop_by_rate_limiting_addresses},
  1669. {"load_balancing", num_of_drop_by_load_balancing_addresses}}),
  1670. 1000);
  1671. // First call succeeds.
  1672. CheckRpcSendOk();
  1673. // But eventually, the update with only dropped servers is processed and calls
  1674. // fail.
  1675. Status status;
  1676. do {
  1677. status = SendRpc(nullptr, 1000, true);
  1678. } while (status.ok());
  1679. EXPECT_FALSE(status.ok());
  1680. EXPECT_EQ(status.error_message(), "drop directed by grpclb balancer");
  1681. }
  1682. class SingleBalancerWithClientLoadReportingTest : public GrpclbEnd2endTest {
  1683. public:
  1684. SingleBalancerWithClientLoadReportingTest() : GrpclbEnd2endTest(4, 1, 3) {}
  1685. };
  1686. TEST_F(SingleBalancerWithClientLoadReportingTest, Vanilla) {
  1687. SetNextResolutionAllBalancers();
  1688. const size_t kNumRpcsPerAddress = 100;
  1689. ScheduleResponseForBalancer(
  1690. 0, BuildResponseForBackends(GetBackendPorts(), {}), 0);
  1691. // Wait until all backends are ready.
  1692. int num_ok = 0;
  1693. int num_failure = 0;
  1694. int num_drops = 0;
  1695. std::tie(num_ok, num_failure, num_drops) = WaitForAllBackends();
  1696. // Send kNumRpcsPerAddress RPCs per server.
  1697. CheckRpcSendOk(kNumRpcsPerAddress * num_backends_);
  1698. // Each backend should have gotten 100 requests.
  1699. for (size_t i = 0; i < backends_.size(); ++i) {
  1700. EXPECT_EQ(kNumRpcsPerAddress, backends_[i]->service_.request_count());
  1701. }
  1702. balancers_[0]->service_.NotifyDoneWithServerlists();
  1703. // The balancer got a single request.
  1704. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  1705. // and sent a single response.
  1706. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  1707. ClientStats client_stats;
  1708. do {
  1709. client_stats += WaitForLoadReports();
  1710. } while (client_stats.num_calls_finished !=
  1711. kNumRpcsPerAddress * num_backends_ + num_ok);
  1712. EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + num_ok,
  1713. client_stats.num_calls_started);
  1714. EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + num_ok,
  1715. client_stats.num_calls_finished);
  1716. EXPECT_EQ(0U, client_stats.num_calls_finished_with_client_failed_to_send);
  1717. EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + (num_ok + num_drops),
  1718. client_stats.num_calls_finished_known_received);
  1719. EXPECT_THAT(client_stats.drop_token_counts, ::testing::ElementsAre());
  1720. }
  1721. TEST_F(SingleBalancerWithClientLoadReportingTest, BalancerRestart) {
  1722. SetNextResolutionAllBalancers();
  1723. const size_t kNumBackendsFirstPass = 2;
  1724. const size_t kNumBackendsSecondPass =
  1725. backends_.size() - kNumBackendsFirstPass;
  1726. // Balancer returns backends starting at index 1.
  1727. ScheduleResponseForBalancer(
  1728. 0,
  1729. BuildResponseForBackends(GetBackendPorts(0, kNumBackendsFirstPass), {}),
  1730. 0);
  1731. // Wait until all backends returned by the balancer are ready.
  1732. int num_ok = 0;
  1733. int num_failure = 0;
  1734. int num_drops = 0;
  1735. std::tie(num_ok, num_failure, num_drops) =
  1736. WaitForAllBackends(/* num_requests_multiple_of */ 1, /* start_index */ 0,
  1737. /* stop_index */ kNumBackendsFirstPass);
  1738. balancers_[0]->service_.NotifyDoneWithServerlists();
  1739. ClientStats client_stats = WaitForLoadReports();
  1740. EXPECT_EQ(static_cast<size_t>(num_ok), client_stats.num_calls_started);
  1741. EXPECT_EQ(static_cast<size_t>(num_ok), client_stats.num_calls_finished);
  1742. EXPECT_EQ(0U, client_stats.num_calls_finished_with_client_failed_to_send);
  1743. EXPECT_EQ(static_cast<size_t>(num_ok),
  1744. client_stats.num_calls_finished_known_received);
  1745. EXPECT_THAT(client_stats.drop_token_counts, ::testing::ElementsAre());
  1746. // Shut down the balancer.
  1747. balancers_[0]->Shutdown();
  1748. // Send 10 more requests per backend. This will continue using the
  1749. // last serverlist we received from the balancer before it was shut down.
  1750. ResetBackendCounters();
  1751. CheckRpcSendOk(kNumBackendsFirstPass);
  1752. // Each backend should have gotten 1 request.
  1753. for (size_t i = 0; i < kNumBackendsFirstPass; ++i) {
  1754. EXPECT_EQ(1UL, backends_[i]->service_.request_count());
  1755. }
  1756. // Now restart the balancer, this time pointing to all backends.
  1757. balancers_[0]->Start(server_host_);
  1758. ScheduleResponseForBalancer(
  1759. 0, BuildResponseForBackends(GetBackendPorts(kNumBackendsFirstPass), {}),
  1760. 0);
  1761. // Wait for queries to start going to one of the new backends.
  1762. // This tells us that we're now using the new serverlist.
  1763. do {
  1764. CheckRpcSendOk();
  1765. } while (backends_[2]->service_.request_count() == 0 &&
  1766. backends_[3]->service_.request_count() == 0);
  1767. // Send one RPC per backend.
  1768. CheckRpcSendOk(kNumBackendsSecondPass);
  1769. balancers_[0]->service_.NotifyDoneWithServerlists();
  1770. // Check client stats.
  1771. client_stats = WaitForLoadReports();
  1772. EXPECT_EQ(kNumBackendsSecondPass + 1, client_stats.num_calls_started);
  1773. EXPECT_EQ(kNumBackendsSecondPass + 1, client_stats.num_calls_finished);
  1774. EXPECT_EQ(0U, client_stats.num_calls_finished_with_client_failed_to_send);
  1775. EXPECT_EQ(kNumBackendsSecondPass + 1,
  1776. client_stats.num_calls_finished_known_received);
  1777. EXPECT_THAT(client_stats.drop_token_counts, ::testing::ElementsAre());
  1778. }
  1779. TEST_F(SingleBalancerWithClientLoadReportingTest, Drop) {
  1780. SetNextResolutionAllBalancers();
  1781. const size_t kNumRpcsPerAddress = 3;
  1782. const int num_of_drop_by_rate_limiting_addresses = 2;
  1783. const int num_of_drop_by_load_balancing_addresses = 1;
  1784. const int num_of_drop_addresses = num_of_drop_by_rate_limiting_addresses +
  1785. num_of_drop_by_load_balancing_addresses;
  1786. const int num_total_addresses = num_backends_ + num_of_drop_addresses;
  1787. ScheduleResponseForBalancer(
  1788. 0,
  1789. BuildResponseForBackends(
  1790. GetBackendPorts(),
  1791. {{"rate_limiting", num_of_drop_by_rate_limiting_addresses},
  1792. {"load_balancing", num_of_drop_by_load_balancing_addresses}}),
  1793. 0);
  1794. // Wait until all backends are ready.
  1795. int num_warmup_ok = 0;
  1796. int num_warmup_failure = 0;
  1797. int num_warmup_drops = 0;
  1798. std::tie(num_warmup_ok, num_warmup_failure, num_warmup_drops) =
  1799. WaitForAllBackends(num_total_addresses /* num_requests_multiple_of */);
  1800. const int num_total_warmup_requests =
  1801. num_warmup_ok + num_warmup_failure + num_warmup_drops;
  1802. size_t num_drops = 0;
  1803. for (size_t i = 0; i < kNumRpcsPerAddress * num_total_addresses; ++i) {
  1804. EchoResponse response;
  1805. const Status status = SendRpc(&response);
  1806. if (!status.ok() &&
  1807. status.error_message() == "drop directed by grpclb balancer") {
  1808. ++num_drops;
  1809. } else {
  1810. EXPECT_TRUE(status.ok()) << "code=" << status.error_code()
  1811. << " message=" << status.error_message();
  1812. EXPECT_EQ(response.message(), kRequestMessage_);
  1813. }
  1814. }
  1815. EXPECT_EQ(kNumRpcsPerAddress * num_of_drop_addresses, num_drops);
  1816. // Each backend should have gotten 100 requests.
  1817. for (size_t i = 0; i < backends_.size(); ++i) {
  1818. EXPECT_EQ(kNumRpcsPerAddress, backends_[i]->service_.request_count());
  1819. }
  1820. balancers_[0]->service_.NotifyDoneWithServerlists();
  1821. // The balancer got a single request.
  1822. EXPECT_EQ(1U, balancers_[0]->service_.request_count());
  1823. // and sent a single response.
  1824. EXPECT_EQ(1U, balancers_[0]->service_.response_count());
  1825. const ClientStats client_stats = WaitForLoadReports();
  1826. EXPECT_EQ(
  1827. kNumRpcsPerAddress * num_total_addresses + num_total_warmup_requests,
  1828. client_stats.num_calls_started);
  1829. EXPECT_EQ(
  1830. kNumRpcsPerAddress * num_total_addresses + num_total_warmup_requests,
  1831. client_stats.num_calls_finished);
  1832. EXPECT_EQ(0U, client_stats.num_calls_finished_with_client_failed_to_send);
  1833. EXPECT_EQ(kNumRpcsPerAddress * num_backends_ + num_warmup_ok,
  1834. client_stats.num_calls_finished_known_received);
  1835. // The number of warmup request is a multiple of the number of addresses.
  1836. // Therefore, all addresses in the scheduled balancer response are hit the
  1837. // same number of times.
  1838. const int num_times_drop_addresses_hit =
  1839. num_warmup_drops / num_of_drop_addresses;
  1840. EXPECT_THAT(
  1841. client_stats.drop_token_counts,
  1842. ::testing::ElementsAre(
  1843. ::testing::Pair("load_balancing",
  1844. (kNumRpcsPerAddress + num_times_drop_addresses_hit)),
  1845. ::testing::Pair(
  1846. "rate_limiting",
  1847. (kNumRpcsPerAddress + num_times_drop_addresses_hit) * 2)));
  1848. }
  1849. } // namespace
  1850. } // namespace testing
  1851. } // namespace grpc
  1852. int main(int argc, char** argv) {
  1853. grpc::testing::TestEnvironment env(argc, argv);
  1854. ::testing::InitGoogleTest(&argc, argv);
  1855. const auto result = RUN_ALL_TESTS();
  1856. return result;
  1857. }