Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.
 
 
 

997 wiersze
28 KiB

  1. /*
  2. *
  3. * Copyright 2016 gRPC authors.
  4. *
  5. * Licensed under the Apache License, Version 2.0 (the "License");
  6. * you may not use this file except in compliance with the License.
  7. * You may obtain a copy of the License at
  8. *
  9. * http://www.apache.org/licenses/LICENSE-2.0
  10. *
  11. * Unless required by applicable law or agreed to in writing, software
  12. * distributed under the License is distributed on an "AS IS" BASIS,
  13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. * See the License for the specific language governing permissions and
  15. * limitations under the License.
  16. *
  17. */
  18. package grpclb
  19. import (
  20. "context"
  21. "errors"
  22. "fmt"
  23. "io"
  24. "net"
  25. "strconv"
  26. "strings"
  27. "sync"
  28. "sync/atomic"
  29. "testing"
  30. "time"
  31. durationpb "github.com/golang/protobuf/ptypes/duration"
  32. "google.golang.org/grpc"
  33. "google.golang.org/grpc/balancer"
  34. lbgrpc "google.golang.org/grpc/balancer/grpclb/grpc_lb_v1"
  35. lbpb "google.golang.org/grpc/balancer/grpclb/grpc_lb_v1"
  36. "google.golang.org/grpc/codes"
  37. "google.golang.org/grpc/credentials"
  38. _ "google.golang.org/grpc/grpclog/glogger"
  39. "google.golang.org/grpc/internal/leakcheck"
  40. "google.golang.org/grpc/metadata"
  41. "google.golang.org/grpc/peer"
  42. "google.golang.org/grpc/resolver"
  43. "google.golang.org/grpc/resolver/manual"
  44. "google.golang.org/grpc/status"
  45. testpb "google.golang.org/grpc/test/grpc_testing"
  46. )
  47. var (
  48. lbServerName = "bar.com"
  49. beServerName = "foo.com"
  50. lbToken = "iamatoken"
  51. // Resolver replaces localhost with fakeName in Next().
  52. // Dialer replaces fakeName with localhost when dialing.
  53. // This will test that custom dialer is passed from Dial to grpclb.
  54. fakeName = "fake.Name"
  55. )
  56. type serverNameCheckCreds struct {
  57. mu sync.Mutex
  58. sn string
  59. expected string
  60. }
  61. func (c *serverNameCheckCreds) ServerHandshake(rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
  62. if _, err := io.WriteString(rawConn, c.sn); err != nil {
  63. fmt.Printf("Failed to write the server name %s to the client %v", c.sn, err)
  64. return nil, nil, err
  65. }
  66. return rawConn, nil, nil
  67. }
  68. func (c *serverNameCheckCreds) ClientHandshake(ctx context.Context, addr string, rawConn net.Conn) (net.Conn, credentials.AuthInfo, error) {
  69. c.mu.Lock()
  70. defer c.mu.Unlock()
  71. b := make([]byte, len(c.expected))
  72. errCh := make(chan error, 1)
  73. go func() {
  74. _, err := rawConn.Read(b)
  75. errCh <- err
  76. }()
  77. select {
  78. case err := <-errCh:
  79. if err != nil {
  80. fmt.Printf("Failed to read the server name from the server %v", err)
  81. return nil, nil, err
  82. }
  83. case <-ctx.Done():
  84. return nil, nil, ctx.Err()
  85. }
  86. if c.expected != string(b) {
  87. fmt.Printf("Read the server name %s want %s", string(b), c.expected)
  88. return nil, nil, errors.New("received unexpected server name")
  89. }
  90. return rawConn, nil, nil
  91. }
  92. func (c *serverNameCheckCreds) Info() credentials.ProtocolInfo {
  93. c.mu.Lock()
  94. defer c.mu.Unlock()
  95. return credentials.ProtocolInfo{}
  96. }
  97. func (c *serverNameCheckCreds) Clone() credentials.TransportCredentials {
  98. c.mu.Lock()
  99. defer c.mu.Unlock()
  100. return &serverNameCheckCreds{
  101. expected: c.expected,
  102. }
  103. }
  104. func (c *serverNameCheckCreds) OverrideServerName(s string) error {
  105. c.mu.Lock()
  106. defer c.mu.Unlock()
  107. c.expected = s
  108. return nil
  109. }
  110. // fakeNameDialer replaces fakeName with localhost when dialing.
  111. // This will test that custom dialer is passed from Dial to grpclb.
  112. func fakeNameDialer(ctx context.Context, addr string) (net.Conn, error) {
  113. addr = strings.Replace(addr, fakeName, "localhost", 1)
  114. return (&net.Dialer{}).DialContext(ctx, "tcp", addr)
  115. }
  116. // merge merges the new client stats into current stats.
  117. //
  118. // It's a test-only method. rpcStats is defined in grpclb_picker.
  119. func (s *rpcStats) merge(cs *lbpb.ClientStats) {
  120. atomic.AddInt64(&s.numCallsStarted, cs.NumCallsStarted)
  121. atomic.AddInt64(&s.numCallsFinished, cs.NumCallsFinished)
  122. atomic.AddInt64(&s.numCallsFinishedWithClientFailedToSend, cs.NumCallsFinishedWithClientFailedToSend)
  123. atomic.AddInt64(&s.numCallsFinishedKnownReceived, cs.NumCallsFinishedKnownReceived)
  124. s.mu.Lock()
  125. for _, perToken := range cs.CallsFinishedWithDrop {
  126. s.numCallsDropped[perToken.LoadBalanceToken] += perToken.NumCalls
  127. }
  128. s.mu.Unlock()
  129. }
  130. func mapsEqual(a, b map[string]int64) bool {
  131. if len(a) != len(b) {
  132. return false
  133. }
  134. for k, v1 := range a {
  135. if v2, ok := b[k]; !ok || v1 != v2 {
  136. return false
  137. }
  138. }
  139. return true
  140. }
  141. func atomicEqual(a, b *int64) bool {
  142. return atomic.LoadInt64(a) == atomic.LoadInt64(b)
  143. }
  144. // equal compares two rpcStats.
  145. //
  146. // It's a test-only method. rpcStats is defined in grpclb_picker.
  147. func (s *rpcStats) equal(o *rpcStats) bool {
  148. if !atomicEqual(&s.numCallsStarted, &o.numCallsStarted) {
  149. return false
  150. }
  151. if !atomicEqual(&s.numCallsFinished, &o.numCallsFinished) {
  152. return false
  153. }
  154. if !atomicEqual(&s.numCallsFinishedWithClientFailedToSend, &o.numCallsFinishedWithClientFailedToSend) {
  155. return false
  156. }
  157. if !atomicEqual(&s.numCallsFinishedKnownReceived, &o.numCallsFinishedKnownReceived) {
  158. return false
  159. }
  160. s.mu.Lock()
  161. defer s.mu.Unlock()
  162. o.mu.Lock()
  163. defer o.mu.Unlock()
  164. return mapsEqual(s.numCallsDropped, o.numCallsDropped)
  165. }
  166. type remoteBalancer struct {
  167. sls chan *lbpb.ServerList
  168. statsDura time.Duration
  169. done chan struct{}
  170. stats *rpcStats
  171. }
  172. func newRemoteBalancer(intervals []time.Duration) *remoteBalancer {
  173. return &remoteBalancer{
  174. sls: make(chan *lbpb.ServerList, 1),
  175. done: make(chan struct{}),
  176. stats: newRPCStats(),
  177. }
  178. }
  179. func (b *remoteBalancer) stop() {
  180. close(b.sls)
  181. close(b.done)
  182. }
  183. func (b *remoteBalancer) BalanceLoad(stream lbgrpc.LoadBalancer_BalanceLoadServer) error {
  184. req, err := stream.Recv()
  185. if err != nil {
  186. return err
  187. }
  188. initReq := req.GetInitialRequest()
  189. if initReq.Name != beServerName {
  190. return status.Errorf(codes.InvalidArgument, "invalid service name: %v", initReq.Name)
  191. }
  192. resp := &lbpb.LoadBalanceResponse{
  193. LoadBalanceResponseType: &lbpb.LoadBalanceResponse_InitialResponse{
  194. InitialResponse: &lbpb.InitialLoadBalanceResponse{
  195. ClientStatsReportInterval: &durationpb.Duration{
  196. Seconds: int64(b.statsDura.Seconds()),
  197. Nanos: int32(b.statsDura.Nanoseconds() - int64(b.statsDura.Seconds())*1e9),
  198. },
  199. },
  200. },
  201. }
  202. if err := stream.Send(resp); err != nil {
  203. return err
  204. }
  205. go func() {
  206. for {
  207. var (
  208. req *lbpb.LoadBalanceRequest
  209. err error
  210. )
  211. if req, err = stream.Recv(); err != nil {
  212. return
  213. }
  214. b.stats.merge(req.GetClientStats())
  215. }
  216. }()
  217. for v := range b.sls {
  218. resp = &lbpb.LoadBalanceResponse{
  219. LoadBalanceResponseType: &lbpb.LoadBalanceResponse_ServerList{
  220. ServerList: v,
  221. },
  222. }
  223. if err := stream.Send(resp); err != nil {
  224. return err
  225. }
  226. }
  227. <-b.done
  228. return nil
  229. }
  230. type testServer struct {
  231. testpb.TestServiceServer
  232. addr string
  233. fallback bool
  234. }
  235. const testmdkey = "testmd"
  236. func (s *testServer) EmptyCall(ctx context.Context, in *testpb.Empty) (*testpb.Empty, error) {
  237. md, ok := metadata.FromIncomingContext(ctx)
  238. if !ok {
  239. return nil, status.Error(codes.Internal, "failed to receive metadata")
  240. }
  241. if !s.fallback && (md == nil || md["lb-token"][0] != lbToken) {
  242. return nil, status.Errorf(codes.Internal, "received unexpected metadata: %v", md)
  243. }
  244. grpc.SetTrailer(ctx, metadata.Pairs(testmdkey, s.addr))
  245. return &testpb.Empty{}, nil
  246. }
  247. func (s *testServer) FullDuplexCall(stream testpb.TestService_FullDuplexCallServer) error {
  248. return nil
  249. }
  250. func startBackends(sn string, fallback bool, lis ...net.Listener) (servers []*grpc.Server) {
  251. for _, l := range lis {
  252. creds := &serverNameCheckCreds{
  253. sn: sn,
  254. }
  255. s := grpc.NewServer(grpc.Creds(creds))
  256. testpb.RegisterTestServiceServer(s, &testServer{addr: l.Addr().String(), fallback: fallback})
  257. servers = append(servers, s)
  258. go func(s *grpc.Server, l net.Listener) {
  259. s.Serve(l)
  260. }(s, l)
  261. }
  262. return
  263. }
  264. func stopBackends(servers []*grpc.Server) {
  265. for _, s := range servers {
  266. s.Stop()
  267. }
  268. }
  269. type testServers struct {
  270. lbAddr string
  271. ls *remoteBalancer
  272. lb *grpc.Server
  273. backends []*grpc.Server
  274. beIPs []net.IP
  275. bePorts []int
  276. }
  277. func newLoadBalancer(numberOfBackends int) (tss *testServers, cleanup func(), err error) {
  278. var (
  279. beListeners []net.Listener
  280. ls *remoteBalancer
  281. lb *grpc.Server
  282. beIPs []net.IP
  283. bePorts []int
  284. )
  285. for i := 0; i < numberOfBackends; i++ {
  286. // Start a backend.
  287. beLis, e := net.Listen("tcp", "localhost:0")
  288. if e != nil {
  289. err = fmt.Errorf("failed to listen %v", err)
  290. return
  291. }
  292. beIPs = append(beIPs, beLis.Addr().(*net.TCPAddr).IP)
  293. bePorts = append(bePorts, beLis.Addr().(*net.TCPAddr).Port)
  294. beListeners = append(beListeners, beLis)
  295. }
  296. backends := startBackends(beServerName, false, beListeners...)
  297. // Start a load balancer.
  298. lbLis, err := net.Listen("tcp", "localhost:0")
  299. if err != nil {
  300. err = fmt.Errorf("failed to create the listener for the load balancer %v", err)
  301. return
  302. }
  303. lbCreds := &serverNameCheckCreds{
  304. sn: lbServerName,
  305. }
  306. lb = grpc.NewServer(grpc.Creds(lbCreds))
  307. ls = newRemoteBalancer(nil)
  308. lbgrpc.RegisterLoadBalancerServer(lb, ls)
  309. go func() {
  310. lb.Serve(lbLis)
  311. }()
  312. tss = &testServers{
  313. lbAddr: net.JoinHostPort(fakeName, strconv.Itoa(lbLis.Addr().(*net.TCPAddr).Port)),
  314. ls: ls,
  315. lb: lb,
  316. backends: backends,
  317. beIPs: beIPs,
  318. bePorts: bePorts,
  319. }
  320. cleanup = func() {
  321. defer stopBackends(backends)
  322. defer func() {
  323. ls.stop()
  324. lb.Stop()
  325. }()
  326. }
  327. return
  328. }
  329. func TestGRPCLB(t *testing.T) {
  330. defer leakcheck.Check(t)
  331. r, cleanup := manual.GenerateAndRegisterManualResolver()
  332. defer cleanup()
  333. tss, cleanup, err := newLoadBalancer(1)
  334. if err != nil {
  335. t.Fatalf("failed to create new load balancer: %v", err)
  336. }
  337. defer cleanup()
  338. be := &lbpb.Server{
  339. IpAddress: tss.beIPs[0],
  340. Port: int32(tss.bePorts[0]),
  341. LoadBalanceToken: lbToken,
  342. }
  343. var bes []*lbpb.Server
  344. bes = append(bes, be)
  345. sl := &lbpb.ServerList{
  346. Servers: bes,
  347. }
  348. tss.ls.sls <- sl
  349. creds := serverNameCheckCreds{
  350. expected: beServerName,
  351. }
  352. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  353. defer cancel()
  354. cc, err := grpc.DialContext(ctx, r.Scheme()+":///"+beServerName,
  355. grpc.WithTransportCredentials(&creds), grpc.WithContextDialer(fakeNameDialer))
  356. if err != nil {
  357. t.Fatalf("Failed to dial to the backend %v", err)
  358. }
  359. defer cc.Close()
  360. testC := testpb.NewTestServiceClient(cc)
  361. r.NewAddress([]resolver.Address{{
  362. Addr: tss.lbAddr,
  363. Type: resolver.GRPCLB,
  364. ServerName: lbServerName,
  365. }})
  366. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true)); err != nil {
  367. t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, <nil>", testC, err)
  368. }
  369. }
  370. // The remote balancer sends response with duplicates to grpclb client.
  371. func TestGRPCLBWeighted(t *testing.T) {
  372. defer leakcheck.Check(t)
  373. r, cleanup := manual.GenerateAndRegisterManualResolver()
  374. defer cleanup()
  375. tss, cleanup, err := newLoadBalancer(2)
  376. if err != nil {
  377. t.Fatalf("failed to create new load balancer: %v", err)
  378. }
  379. defer cleanup()
  380. beServers := []*lbpb.Server{{
  381. IpAddress: tss.beIPs[0],
  382. Port: int32(tss.bePorts[0]),
  383. LoadBalanceToken: lbToken,
  384. }, {
  385. IpAddress: tss.beIPs[1],
  386. Port: int32(tss.bePorts[1]),
  387. LoadBalanceToken: lbToken,
  388. }}
  389. portsToIndex := make(map[int]int)
  390. for i := range beServers {
  391. portsToIndex[tss.bePorts[i]] = i
  392. }
  393. creds := serverNameCheckCreds{
  394. expected: beServerName,
  395. }
  396. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  397. defer cancel()
  398. cc, err := grpc.DialContext(ctx, r.Scheme()+":///"+beServerName,
  399. grpc.WithTransportCredentials(&creds), grpc.WithContextDialer(fakeNameDialer))
  400. if err != nil {
  401. t.Fatalf("Failed to dial to the backend %v", err)
  402. }
  403. defer cc.Close()
  404. testC := testpb.NewTestServiceClient(cc)
  405. r.NewAddress([]resolver.Address{{
  406. Addr: tss.lbAddr,
  407. Type: resolver.GRPCLB,
  408. ServerName: lbServerName,
  409. }})
  410. sequences := []string{"00101", "00011"}
  411. for _, seq := range sequences {
  412. var (
  413. bes []*lbpb.Server
  414. p peer.Peer
  415. result string
  416. )
  417. for _, s := range seq {
  418. bes = append(bes, beServers[s-'0'])
  419. }
  420. tss.ls.sls <- &lbpb.ServerList{Servers: bes}
  421. for i := 0; i < 1000; i++ {
  422. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true), grpc.Peer(&p)); err != nil {
  423. t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, <nil>", testC, err)
  424. }
  425. result += strconv.Itoa(portsToIndex[p.Addr.(*net.TCPAddr).Port])
  426. }
  427. // The generated result will be in format of "0010100101".
  428. if !strings.Contains(result, strings.Repeat(seq, 2)) {
  429. t.Errorf("got result sequence %q, want patten %q", result, seq)
  430. }
  431. }
  432. }
  433. func TestDropRequest(t *testing.T) {
  434. defer leakcheck.Check(t)
  435. r, cleanup := manual.GenerateAndRegisterManualResolver()
  436. defer cleanup()
  437. tss, cleanup, err := newLoadBalancer(2)
  438. if err != nil {
  439. t.Fatalf("failed to create new load balancer: %v", err)
  440. }
  441. defer cleanup()
  442. tss.ls.sls <- &lbpb.ServerList{
  443. Servers: []*lbpb.Server{{
  444. IpAddress: tss.beIPs[0],
  445. Port: int32(tss.bePorts[0]),
  446. LoadBalanceToken: lbToken,
  447. Drop: false,
  448. }, {
  449. IpAddress: tss.beIPs[1],
  450. Port: int32(tss.bePorts[1]),
  451. LoadBalanceToken: lbToken,
  452. Drop: false,
  453. }, {
  454. Drop: true,
  455. }},
  456. }
  457. creds := serverNameCheckCreds{
  458. expected: beServerName,
  459. }
  460. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  461. defer cancel()
  462. cc, err := grpc.DialContext(ctx, r.Scheme()+":///"+beServerName,
  463. grpc.WithTransportCredentials(&creds), grpc.WithContextDialer(fakeNameDialer))
  464. if err != nil {
  465. t.Fatalf("Failed to dial to the backend %v", err)
  466. }
  467. defer cc.Close()
  468. testC := testpb.NewTestServiceClient(cc)
  469. r.NewAddress([]resolver.Address{{
  470. Addr: tss.lbAddr,
  471. Type: resolver.GRPCLB,
  472. ServerName: lbServerName,
  473. }})
  474. // Wait for the 1st, non-fail-fast RPC to succeed. This ensures both server
  475. // connections are made, because the first one has Drop set to true.
  476. var i int
  477. for i = 0; i < 1000; i++ {
  478. if _, err := testC.EmptyCall(ctx, &testpb.Empty{}, grpc.WaitForReady(true)); err == nil {
  479. break
  480. }
  481. time.Sleep(time.Millisecond)
  482. }
  483. if i >= 1000 {
  484. t.Fatalf("%v.SayHello(_, _) = _, %v, want _, <nil>", testC, err)
  485. }
  486. select {
  487. case <-ctx.Done():
  488. t.Fatal("timed out", ctx.Err())
  489. default:
  490. }
  491. for _, failfast := range []bool{true, false} {
  492. for i := 0; i < 3; i++ {
  493. // 1st RPCs pick the second item in server list. They should succeed
  494. // since they choose the non-drop-request backend according to the
  495. // round robin policy.
  496. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(!failfast)); err != nil {
  497. t.Errorf("%v.EmptyCall(_, _) = _, %v, want _, <nil>", testC, err)
  498. }
  499. // 2st RPCs should fail, because they pick last item in server list,
  500. // with Drop set to true.
  501. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(!failfast)); status.Code(err) != codes.Unavailable {
  502. t.Errorf("%v.EmptyCall(_, _) = _, %v, want _, %s", testC, err, codes.Unavailable)
  503. }
  504. // 3rd RPCs pick the first item in server list. They should succeed
  505. // since they choose the non-drop-request backend according to the
  506. // round robin policy.
  507. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(!failfast)); err != nil {
  508. t.Errorf("%v.EmptyCall(_, _) = _, %v, want _, <nil>", testC, err)
  509. }
  510. }
  511. }
  512. tss.backends[0].Stop()
  513. // This last pick was backend 0. Closing backend 0 doesn't reset drop index
  514. // (for level 1 picking), so the following picks will be (backend1, drop,
  515. // backend1), instead of (backend, backend, drop) if drop index was reset.
  516. time.Sleep(time.Second)
  517. for i := 0; i < 3; i++ {
  518. var p peer.Peer
  519. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true), grpc.Peer(&p)); err != nil {
  520. t.Errorf("%v.EmptyCall(_, _) = _, %v, want _, <nil>", testC, err)
  521. }
  522. if want := tss.bePorts[1]; p.Addr.(*net.TCPAddr).Port != want {
  523. t.Errorf("got peer: %v, want peer port: %v", p.Addr, want)
  524. }
  525. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true)); status.Code(err) != codes.Unavailable {
  526. t.Errorf("%v.EmptyCall(_, _) = _, %v, want _, %s", testC, err, codes.Unavailable)
  527. }
  528. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true), grpc.Peer(&p)); err != nil {
  529. t.Errorf("%v.EmptyCall(_, _) = _, %v, want _, <nil>", testC, err)
  530. }
  531. if want := tss.bePorts[1]; p.Addr.(*net.TCPAddr).Port != want {
  532. t.Errorf("got peer: %v, want peer port: %v", p.Addr, want)
  533. }
  534. }
  535. }
  536. // When the balancer in use disconnects, grpclb should connect to the next address from resolved balancer address list.
  537. func TestBalancerDisconnects(t *testing.T) {
  538. defer leakcheck.Check(t)
  539. r, cleanup := manual.GenerateAndRegisterManualResolver()
  540. defer cleanup()
  541. var (
  542. tests []*testServers
  543. lbs []*grpc.Server
  544. )
  545. for i := 0; i < 2; i++ {
  546. tss, cleanup, err := newLoadBalancer(1)
  547. if err != nil {
  548. t.Fatalf("failed to create new load balancer: %v", err)
  549. }
  550. defer cleanup()
  551. be := &lbpb.Server{
  552. IpAddress: tss.beIPs[0],
  553. Port: int32(tss.bePorts[0]),
  554. LoadBalanceToken: lbToken,
  555. }
  556. var bes []*lbpb.Server
  557. bes = append(bes, be)
  558. sl := &lbpb.ServerList{
  559. Servers: bes,
  560. }
  561. tss.ls.sls <- sl
  562. tests = append(tests, tss)
  563. lbs = append(lbs, tss.lb)
  564. }
  565. creds := serverNameCheckCreds{
  566. expected: beServerName,
  567. }
  568. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  569. defer cancel()
  570. cc, err := grpc.DialContext(ctx, r.Scheme()+":///"+beServerName,
  571. grpc.WithTransportCredentials(&creds), grpc.WithContextDialer(fakeNameDialer))
  572. if err != nil {
  573. t.Fatalf("Failed to dial to the backend %v", err)
  574. }
  575. defer cc.Close()
  576. testC := testpb.NewTestServiceClient(cc)
  577. r.NewAddress([]resolver.Address{{
  578. Addr: tests[0].lbAddr,
  579. Type: resolver.GRPCLB,
  580. ServerName: lbServerName,
  581. }, {
  582. Addr: tests[1].lbAddr,
  583. Type: resolver.GRPCLB,
  584. ServerName: lbServerName,
  585. }})
  586. var p peer.Peer
  587. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true), grpc.Peer(&p)); err != nil {
  588. t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, <nil>", testC, err)
  589. }
  590. if p.Addr.(*net.TCPAddr).Port != tests[0].bePorts[0] {
  591. t.Fatalf("got peer: %v, want peer port: %v", p.Addr, tests[0].bePorts[0])
  592. }
  593. lbs[0].Stop()
  594. // Stop balancer[0], balancer[1] should be used by grpclb.
  595. // Check peer address to see if that happened.
  596. for i := 0; i < 1000; i++ {
  597. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true), grpc.Peer(&p)); err != nil {
  598. t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, <nil>", testC, err)
  599. }
  600. if p.Addr.(*net.TCPAddr).Port == tests[1].bePorts[0] {
  601. return
  602. }
  603. time.Sleep(time.Millisecond)
  604. }
  605. t.Fatalf("No RPC sent to second backend after 1 second")
  606. }
  607. func TestFallback(t *testing.T) {
  608. balancer.Register(newLBBuilderWithFallbackTimeout(100 * time.Millisecond))
  609. defer balancer.Register(newLBBuilder())
  610. defer leakcheck.Check(t)
  611. r, cleanup := manual.GenerateAndRegisterManualResolver()
  612. defer cleanup()
  613. tss, cleanup, err := newLoadBalancer(1)
  614. if err != nil {
  615. t.Fatalf("failed to create new load balancer: %v", err)
  616. }
  617. defer cleanup()
  618. // Start a standalone backend.
  619. beLis, err := net.Listen("tcp", "localhost:0")
  620. if err != nil {
  621. t.Fatalf("Failed to listen %v", err)
  622. }
  623. defer beLis.Close()
  624. standaloneBEs := startBackends(beServerName, true, beLis)
  625. defer stopBackends(standaloneBEs)
  626. be := &lbpb.Server{
  627. IpAddress: tss.beIPs[0],
  628. Port: int32(tss.bePorts[0]),
  629. LoadBalanceToken: lbToken,
  630. }
  631. var bes []*lbpb.Server
  632. bes = append(bes, be)
  633. sl := &lbpb.ServerList{
  634. Servers: bes,
  635. }
  636. tss.ls.sls <- sl
  637. creds := serverNameCheckCreds{
  638. expected: beServerName,
  639. }
  640. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  641. defer cancel()
  642. cc, err := grpc.DialContext(ctx, r.Scheme()+":///"+beServerName,
  643. grpc.WithTransportCredentials(&creds), grpc.WithContextDialer(fakeNameDialer))
  644. if err != nil {
  645. t.Fatalf("Failed to dial to the backend %v", err)
  646. }
  647. defer cc.Close()
  648. testC := testpb.NewTestServiceClient(cc)
  649. r.NewAddress([]resolver.Address{{
  650. Addr: "",
  651. Type: resolver.GRPCLB,
  652. ServerName: lbServerName,
  653. }, {
  654. Addr: beLis.Addr().String(),
  655. Type: resolver.Backend,
  656. ServerName: beServerName,
  657. }})
  658. var p peer.Peer
  659. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true), grpc.Peer(&p)); err != nil {
  660. t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, <nil>", testC, err)
  661. }
  662. if p.Addr.String() != beLis.Addr().String() {
  663. t.Fatalf("got peer: %v, want peer: %v", p.Addr, beLis.Addr())
  664. }
  665. r.NewAddress([]resolver.Address{{
  666. Addr: tss.lbAddr,
  667. Type: resolver.GRPCLB,
  668. ServerName: lbServerName,
  669. }, {
  670. Addr: beLis.Addr().String(),
  671. Type: resolver.Backend,
  672. ServerName: beServerName,
  673. }})
  674. for i := 0; i < 1000; i++ {
  675. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true), grpc.Peer(&p)); err != nil {
  676. t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, <nil>", testC, err)
  677. }
  678. if p.Addr.(*net.TCPAddr).Port == tss.bePorts[0] {
  679. return
  680. }
  681. time.Sleep(time.Millisecond)
  682. }
  683. t.Fatalf("No RPC sent to backend behind remote balancer after 1 second")
  684. }
  685. type failPreRPCCred struct{}
  686. func (failPreRPCCred) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) {
  687. if strings.Contains(uri[0], failtosendURI) {
  688. return nil, fmt.Errorf("rpc should fail to send")
  689. }
  690. return nil, nil
  691. }
  692. func (failPreRPCCred) RequireTransportSecurity() bool {
  693. return false
  694. }
  695. func checkStats(stats, expected *rpcStats) error {
  696. if !stats.equal(expected) {
  697. return fmt.Errorf("stats not equal: got %+v, want %+v", stats, expected)
  698. }
  699. return nil
  700. }
  701. func runAndGetStats(t *testing.T, drop bool, runRPCs func(*grpc.ClientConn)) *rpcStats {
  702. defer leakcheck.Check(t)
  703. r, cleanup := manual.GenerateAndRegisterManualResolver()
  704. defer cleanup()
  705. tss, cleanup, err := newLoadBalancer(1)
  706. if err != nil {
  707. t.Fatalf("failed to create new load balancer: %v", err)
  708. }
  709. defer cleanup()
  710. servers := []*lbpb.Server{{
  711. IpAddress: tss.beIPs[0],
  712. Port: int32(tss.bePorts[0]),
  713. LoadBalanceToken: lbToken,
  714. }}
  715. if drop {
  716. servers = append(servers, &lbpb.Server{
  717. LoadBalanceToken: lbToken,
  718. Drop: drop,
  719. })
  720. }
  721. tss.ls.sls <- &lbpb.ServerList{Servers: servers}
  722. tss.ls.statsDura = 100 * time.Millisecond
  723. creds := serverNameCheckCreds{expected: beServerName}
  724. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  725. defer cancel()
  726. cc, err := grpc.DialContext(ctx, r.Scheme()+":///"+beServerName,
  727. grpc.WithTransportCredentials(&creds),
  728. grpc.WithPerRPCCredentials(failPreRPCCred{}),
  729. grpc.WithContextDialer(fakeNameDialer))
  730. if err != nil {
  731. t.Fatalf("Failed to dial to the backend %v", err)
  732. }
  733. defer cc.Close()
  734. r.NewAddress([]resolver.Address{{
  735. Addr: tss.lbAddr,
  736. Type: resolver.GRPCLB,
  737. ServerName: lbServerName,
  738. }})
  739. runRPCs(cc)
  740. time.Sleep(1 * time.Second)
  741. stats := tss.ls.stats
  742. return stats
  743. }
  744. const (
  745. countRPC = 40
  746. failtosendURI = "failtosend"
  747. )
  748. func TestGRPCLBStatsUnarySuccess(t *testing.T) {
  749. defer leakcheck.Check(t)
  750. stats := runAndGetStats(t, false, func(cc *grpc.ClientConn) {
  751. testC := testpb.NewTestServiceClient(cc)
  752. // The first non-failfast RPC succeeds, all connections are up.
  753. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true)); err != nil {
  754. t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, <nil>", testC, err)
  755. }
  756. for i := 0; i < countRPC-1; i++ {
  757. testC.EmptyCall(context.Background(), &testpb.Empty{})
  758. }
  759. })
  760. if err := checkStats(stats, &rpcStats{
  761. numCallsStarted: int64(countRPC),
  762. numCallsFinished: int64(countRPC),
  763. numCallsFinishedKnownReceived: int64(countRPC),
  764. }); err != nil {
  765. t.Fatal(err)
  766. }
  767. }
  768. func TestGRPCLBStatsUnaryDrop(t *testing.T) {
  769. defer leakcheck.Check(t)
  770. stats := runAndGetStats(t, true, func(cc *grpc.ClientConn) {
  771. testC := testpb.NewTestServiceClient(cc)
  772. // The first non-failfast RPC succeeds, all connections are up.
  773. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true)); err != nil {
  774. t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, <nil>", testC, err)
  775. }
  776. for i := 0; i < countRPC-1; i++ {
  777. testC.EmptyCall(context.Background(), &testpb.Empty{})
  778. }
  779. })
  780. if err := checkStats(stats, &rpcStats{
  781. numCallsStarted: int64(countRPC),
  782. numCallsFinished: int64(countRPC),
  783. numCallsFinishedKnownReceived: int64(countRPC) / 2,
  784. numCallsDropped: map[string]int64{lbToken: int64(countRPC) / 2},
  785. }); err != nil {
  786. t.Fatal(err)
  787. }
  788. }
  789. func TestGRPCLBStatsUnaryFailedToSend(t *testing.T) {
  790. defer leakcheck.Check(t)
  791. stats := runAndGetStats(t, false, func(cc *grpc.ClientConn) {
  792. testC := testpb.NewTestServiceClient(cc)
  793. // The first non-failfast RPC succeeds, all connections are up.
  794. if _, err := testC.EmptyCall(context.Background(), &testpb.Empty{}, grpc.WaitForReady(true)); err != nil {
  795. t.Fatalf("%v.EmptyCall(_, _) = _, %v, want _, <nil>", testC, err)
  796. }
  797. for i := 0; i < countRPC-1; i++ {
  798. cc.Invoke(context.Background(), failtosendURI, &testpb.Empty{}, nil)
  799. }
  800. })
  801. if err := checkStats(stats, &rpcStats{
  802. numCallsStarted: int64(countRPC),
  803. numCallsFinished: int64(countRPC),
  804. numCallsFinishedWithClientFailedToSend: int64(countRPC - 1),
  805. numCallsFinishedKnownReceived: 1,
  806. }); err != nil {
  807. t.Fatal(err)
  808. }
  809. }
  810. func TestGRPCLBStatsStreamingSuccess(t *testing.T) {
  811. defer leakcheck.Check(t)
  812. stats := runAndGetStats(t, false, func(cc *grpc.ClientConn) {
  813. testC := testpb.NewTestServiceClient(cc)
  814. // The first non-failfast RPC succeeds, all connections are up.
  815. stream, err := testC.FullDuplexCall(context.Background(), grpc.WaitForReady(true))
  816. if err != nil {
  817. t.Fatalf("%v.FullDuplexCall(_, _) = _, %v, want _, <nil>", testC, err)
  818. }
  819. for {
  820. if _, err = stream.Recv(); err == io.EOF {
  821. break
  822. }
  823. }
  824. for i := 0; i < countRPC-1; i++ {
  825. stream, err = testC.FullDuplexCall(context.Background())
  826. if err == nil {
  827. // Wait for stream to end if err is nil.
  828. for {
  829. if _, err = stream.Recv(); err == io.EOF {
  830. break
  831. }
  832. }
  833. }
  834. }
  835. })
  836. if err := checkStats(stats, &rpcStats{
  837. numCallsStarted: int64(countRPC),
  838. numCallsFinished: int64(countRPC),
  839. numCallsFinishedKnownReceived: int64(countRPC),
  840. }); err != nil {
  841. t.Fatal(err)
  842. }
  843. }
  844. func TestGRPCLBStatsStreamingDrop(t *testing.T) {
  845. defer leakcheck.Check(t)
  846. stats := runAndGetStats(t, true, func(cc *grpc.ClientConn) {
  847. testC := testpb.NewTestServiceClient(cc)
  848. // The first non-failfast RPC succeeds, all connections are up.
  849. stream, err := testC.FullDuplexCall(context.Background(), grpc.WaitForReady(true))
  850. if err != nil {
  851. t.Fatalf("%v.FullDuplexCall(_, _) = _, %v, want _, <nil>", testC, err)
  852. }
  853. for {
  854. if _, err = stream.Recv(); err == io.EOF {
  855. break
  856. }
  857. }
  858. for i := 0; i < countRPC-1; i++ {
  859. stream, err = testC.FullDuplexCall(context.Background())
  860. if err == nil {
  861. // Wait for stream to end if err is nil.
  862. for {
  863. if _, err = stream.Recv(); err == io.EOF {
  864. break
  865. }
  866. }
  867. }
  868. }
  869. })
  870. if err := checkStats(stats, &rpcStats{
  871. numCallsStarted: int64(countRPC),
  872. numCallsFinished: int64(countRPC),
  873. numCallsFinishedKnownReceived: int64(countRPC) / 2,
  874. numCallsDropped: map[string]int64{lbToken: int64(countRPC) / 2},
  875. }); err != nil {
  876. t.Fatal(err)
  877. }
  878. }
  879. func TestGRPCLBStatsStreamingFailedToSend(t *testing.T) {
  880. defer leakcheck.Check(t)
  881. stats := runAndGetStats(t, false, func(cc *grpc.ClientConn) {
  882. testC := testpb.NewTestServiceClient(cc)
  883. // The first non-failfast RPC succeeds, all connections are up.
  884. stream, err := testC.FullDuplexCall(context.Background(), grpc.WaitForReady(true))
  885. if err != nil {
  886. t.Fatalf("%v.FullDuplexCall(_, _) = _, %v, want _, <nil>", testC, err)
  887. }
  888. for {
  889. if _, err = stream.Recv(); err == io.EOF {
  890. break
  891. }
  892. }
  893. for i := 0; i < countRPC-1; i++ {
  894. cc.NewStream(context.Background(), &grpc.StreamDesc{}, failtosendURI)
  895. }
  896. })
  897. if err := checkStats(stats, &rpcStats{
  898. numCallsStarted: int64(countRPC),
  899. numCallsFinished: int64(countRPC),
  900. numCallsFinishedWithClientFailedToSend: int64(countRPC - 1),
  901. numCallsFinishedKnownReceived: 1,
  902. }); err != nil {
  903. t.Fatal(err)
  904. }
  905. }