選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 

1972 行
69 KiB

  1. /*
  2. *
  3. * Copyright 2018 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 test
  19. import (
  20. "context"
  21. "crypto/tls"
  22. "fmt"
  23. "net"
  24. "reflect"
  25. "sync"
  26. "testing"
  27. "time"
  28. "golang.org/x/net/http2"
  29. "google.golang.org/grpc"
  30. _ "google.golang.org/grpc/balancer/grpclb"
  31. "google.golang.org/grpc/balancer/roundrobin"
  32. "google.golang.org/grpc/codes"
  33. "google.golang.org/grpc/connectivity"
  34. "google.golang.org/grpc/credentials"
  35. "google.golang.org/grpc/internal"
  36. "google.golang.org/grpc/internal/channelz"
  37. "google.golang.org/grpc/keepalive"
  38. "google.golang.org/grpc/resolver"
  39. "google.golang.org/grpc/resolver/manual"
  40. "google.golang.org/grpc/status"
  41. testpb "google.golang.org/grpc/test/grpc_testing"
  42. "google.golang.org/grpc/testdata"
  43. )
  44. func (te *test) startServers(ts testpb.TestServiceServer, num int) {
  45. for i := 0; i < num; i++ {
  46. te.startServer(ts)
  47. te.srvs = append(te.srvs, te.srv.(*grpc.Server))
  48. te.srvAddrs = append(te.srvAddrs, te.srvAddr)
  49. te.srv = nil
  50. te.srvAddr = ""
  51. }
  52. }
  53. func verifyResultWithDelay(f func() (bool, error)) error {
  54. var ok bool
  55. var err error
  56. for i := 0; i < 1000; i++ {
  57. if ok, err = f(); ok {
  58. return nil
  59. }
  60. time.Sleep(10 * time.Millisecond)
  61. }
  62. return err
  63. }
  64. func (s) TestCZServerRegistrationAndDeletion(t *testing.T) {
  65. testcases := []struct {
  66. total int
  67. start int64
  68. max int64
  69. length int64
  70. end bool
  71. }{
  72. {total: int(channelz.EntryPerPage), start: 0, max: 0, length: channelz.EntryPerPage, end: true},
  73. {total: int(channelz.EntryPerPage) - 1, start: 0, max: 0, length: channelz.EntryPerPage - 1, end: true},
  74. {total: int(channelz.EntryPerPage) + 1, start: 0, max: 0, length: channelz.EntryPerPage, end: false},
  75. {total: int(channelz.EntryPerPage) + 1, start: int64(2*(channelz.EntryPerPage+1) + 1), max: 0, length: 0, end: true},
  76. {total: int(channelz.EntryPerPage), start: 0, max: 1, length: 1, end: false},
  77. {total: int(channelz.EntryPerPage), start: 0, max: channelz.EntryPerPage - 1, length: channelz.EntryPerPage - 1, end: false},
  78. }
  79. for _, c := range testcases {
  80. channelz.NewChannelzStorage()
  81. e := tcpClearRREnv
  82. te := newTest(t, e)
  83. te.startServers(&testServer{security: e.security}, c.total)
  84. ss, end := channelz.GetServers(c.start, c.max)
  85. if int64(len(ss)) != c.length || end != c.end {
  86. t.Fatalf("GetServers(%d) = %+v (len of which: %d), end: %+v, want len(GetServers(%d)) = %d, end: %+v", c.start, ss, len(ss), end, c.start, c.length, c.end)
  87. }
  88. te.tearDown()
  89. ss, end = channelz.GetServers(c.start, c.max)
  90. if len(ss) != 0 || !end {
  91. t.Fatalf("GetServers(0) = %+v (len of which: %d), end: %+v, want len(GetServers(0)) = 0, end: true", ss, len(ss), end)
  92. }
  93. }
  94. }
  95. func (s) TestCZGetServer(t *testing.T) {
  96. channelz.NewChannelzStorage()
  97. e := tcpClearRREnv
  98. te := newTest(t, e)
  99. te.startServer(&testServer{security: e.security})
  100. defer te.tearDown()
  101. ss, _ := channelz.GetServers(0, 0)
  102. if len(ss) != 1 {
  103. t.Fatalf("there should only be one server, not %d", len(ss))
  104. }
  105. serverID := ss[0].ID
  106. srv := channelz.GetServer(serverID)
  107. if srv == nil {
  108. t.Fatalf("server %d does not exist", serverID)
  109. }
  110. if srv.ID != serverID {
  111. t.Fatalf("server want id %d, but got %d", serverID, srv.ID)
  112. }
  113. te.tearDown()
  114. if err := verifyResultWithDelay(func() (bool, error) {
  115. srv := channelz.GetServer(serverID)
  116. if srv != nil {
  117. return false, fmt.Errorf("server %d should not exist", serverID)
  118. }
  119. return true, nil
  120. }); err != nil {
  121. t.Fatal(err)
  122. }
  123. }
  124. func (s) TestCZTopChannelRegistrationAndDeletion(t *testing.T) {
  125. testcases := []struct {
  126. total int
  127. start int64
  128. max int64
  129. length int64
  130. end bool
  131. }{
  132. {total: int(channelz.EntryPerPage), start: 0, max: 0, length: channelz.EntryPerPage, end: true},
  133. {total: int(channelz.EntryPerPage) - 1, start: 0, max: 0, length: channelz.EntryPerPage - 1, end: true},
  134. {total: int(channelz.EntryPerPage) + 1, start: 0, max: 0, length: channelz.EntryPerPage, end: false},
  135. {total: int(channelz.EntryPerPage) + 1, start: int64(2*(channelz.EntryPerPage+1) + 1), max: 0, length: 0, end: true},
  136. {total: int(channelz.EntryPerPage), start: 0, max: 1, length: 1, end: false},
  137. {total: int(channelz.EntryPerPage), start: 0, max: channelz.EntryPerPage - 1, length: channelz.EntryPerPage - 1, end: false},
  138. }
  139. for _, c := range testcases {
  140. channelz.NewChannelzStorage()
  141. e := tcpClearRREnv
  142. te := newTest(t, e)
  143. var ccs []*grpc.ClientConn
  144. for i := 0; i < c.total; i++ {
  145. cc := te.clientConn()
  146. te.cc = nil
  147. // avoid making next dial blocking
  148. te.srvAddr = ""
  149. ccs = append(ccs, cc)
  150. }
  151. if err := verifyResultWithDelay(func() (bool, error) {
  152. if tcs, end := channelz.GetTopChannels(c.start, c.max); int64(len(tcs)) != c.length || end != c.end {
  153. return false, fmt.Errorf("getTopChannels(%d) = %+v (len of which: %d), end: %+v, want len(GetTopChannels(%d)) = %d, end: %+v", c.start, tcs, len(tcs), end, c.start, c.length, c.end)
  154. }
  155. return true, nil
  156. }); err != nil {
  157. t.Fatal(err)
  158. }
  159. for _, cc := range ccs {
  160. cc.Close()
  161. }
  162. if err := verifyResultWithDelay(func() (bool, error) {
  163. if tcs, end := channelz.GetTopChannels(c.start, c.max); len(tcs) != 0 || !end {
  164. return false, fmt.Errorf("getTopChannels(0) = %+v (len of which: %d), end: %+v, want len(GetTopChannels(0)) = 0, end: true", tcs, len(tcs), end)
  165. }
  166. return true, nil
  167. }); err != nil {
  168. t.Fatal(err)
  169. }
  170. te.tearDown()
  171. }
  172. }
  173. func (s) TestCZNestedChannelRegistrationAndDeletion(t *testing.T) {
  174. channelz.NewChannelzStorage()
  175. e := tcpClearRREnv
  176. // avoid calling API to set balancer type, which will void service config's change of balancer.
  177. e.balancer = ""
  178. te := newTest(t, e)
  179. r, cleanup := manual.GenerateAndRegisterManualResolver()
  180. defer cleanup()
  181. resolvedAddrs := []resolver.Address{{Addr: "127.0.0.1:0", Type: resolver.GRPCLB, ServerName: "grpclb.server"}}
  182. r.InitialAddrs(resolvedAddrs)
  183. te.resolverScheme = r.Scheme()
  184. te.clientConn()
  185. defer te.tearDown()
  186. if err := verifyResultWithDelay(func() (bool, error) {
  187. tcs, _ := channelz.GetTopChannels(0, 0)
  188. if len(tcs) != 1 {
  189. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  190. }
  191. if len(tcs[0].NestedChans) != 1 {
  192. return false, fmt.Errorf("there should be one nested channel from grpclb, not %d", len(tcs[0].NestedChans))
  193. }
  194. return true, nil
  195. }); err != nil {
  196. t.Fatal(err)
  197. }
  198. r.NewServiceConfig(`{"loadBalancingPolicy": "round_robin"}`)
  199. r.NewAddress([]resolver.Address{{Addr: "127.0.0.1:0"}})
  200. // wait for the shutdown of grpclb balancer
  201. if err := verifyResultWithDelay(func() (bool, error) {
  202. tcs, _ := channelz.GetTopChannels(0, 0)
  203. if len(tcs) != 1 {
  204. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  205. }
  206. if len(tcs[0].NestedChans) != 0 {
  207. return false, fmt.Errorf("there should be 0 nested channel from grpclb, not %d", len(tcs[0].NestedChans))
  208. }
  209. return true, nil
  210. }); err != nil {
  211. t.Fatal(err)
  212. }
  213. }
  214. func (s) TestCZClientSubChannelSocketRegistrationAndDeletion(t *testing.T) {
  215. channelz.NewChannelzStorage()
  216. e := tcpClearRREnv
  217. num := 3 // number of backends
  218. te := newTest(t, e)
  219. var svrAddrs []resolver.Address
  220. te.startServers(&testServer{security: e.security}, num)
  221. r, cleanup := manual.GenerateAndRegisterManualResolver()
  222. defer cleanup()
  223. for _, a := range te.srvAddrs {
  224. svrAddrs = append(svrAddrs, resolver.Address{Addr: a})
  225. }
  226. r.InitialAddrs(svrAddrs)
  227. te.resolverScheme = r.Scheme()
  228. te.clientConn()
  229. defer te.tearDown()
  230. // Here, we just wait for all sockets to be up. In the future, if we implement
  231. // IDLE, we may need to make several rpc calls to create the sockets.
  232. if err := verifyResultWithDelay(func() (bool, error) {
  233. tcs, _ := channelz.GetTopChannels(0, 0)
  234. if len(tcs) != 1 {
  235. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  236. }
  237. if len(tcs[0].SubChans) != num {
  238. return false, fmt.Errorf("there should be %d subchannel not %d", num, len(tcs[0].SubChans))
  239. }
  240. count := 0
  241. for k := range tcs[0].SubChans {
  242. sc := channelz.GetSubChannel(k)
  243. if sc == nil {
  244. return false, fmt.Errorf("got <nil> subchannel")
  245. }
  246. count += len(sc.Sockets)
  247. }
  248. if count != num {
  249. return false, fmt.Errorf("there should be %d sockets not %d", num, count)
  250. }
  251. return true, nil
  252. }); err != nil {
  253. t.Fatal(err)
  254. }
  255. r.NewAddress(svrAddrs[:len(svrAddrs)-1])
  256. if err := verifyResultWithDelay(func() (bool, error) {
  257. tcs, _ := channelz.GetTopChannels(0, 0)
  258. if len(tcs) != 1 {
  259. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  260. }
  261. if len(tcs[0].SubChans) != num-1 {
  262. return false, fmt.Errorf("there should be %d subchannel not %d", num-1, len(tcs[0].SubChans))
  263. }
  264. count := 0
  265. for k := range tcs[0].SubChans {
  266. sc := channelz.GetSubChannel(k)
  267. if sc == nil {
  268. return false, fmt.Errorf("got <nil> subchannel")
  269. }
  270. count += len(sc.Sockets)
  271. }
  272. if count != num-1 {
  273. return false, fmt.Errorf("there should be %d sockets not %d", num-1, count)
  274. }
  275. return true, nil
  276. }); err != nil {
  277. t.Fatal(err)
  278. }
  279. }
  280. func (s) TestCZServerSocketRegistrationAndDeletion(t *testing.T) {
  281. testcases := []struct {
  282. total int
  283. start int64
  284. max int64
  285. length int64
  286. end bool
  287. }{
  288. {total: int(channelz.EntryPerPage), start: 0, max: 0, length: channelz.EntryPerPage, end: true},
  289. {total: int(channelz.EntryPerPage) - 1, start: 0, max: 0, length: channelz.EntryPerPage - 1, end: true},
  290. {total: int(channelz.EntryPerPage) + 1, start: 0, max: 0, length: channelz.EntryPerPage, end: false},
  291. {total: int(channelz.EntryPerPage), start: 1, max: 0, length: channelz.EntryPerPage - 1, end: true},
  292. {total: int(channelz.EntryPerPage) + 1, start: channelz.EntryPerPage + 1, max: 0, length: 0, end: true},
  293. {total: int(channelz.EntryPerPage), start: 0, max: 1, length: 1, end: false},
  294. {total: int(channelz.EntryPerPage), start: 0, max: channelz.EntryPerPage - 1, length: channelz.EntryPerPage - 1, end: false},
  295. }
  296. for _, c := range testcases {
  297. channelz.NewChannelzStorage()
  298. e := tcpClearRREnv
  299. te := newTest(t, e)
  300. te.startServer(&testServer{security: e.security})
  301. defer te.tearDown()
  302. var ccs []*grpc.ClientConn
  303. for i := 0; i < c.total; i++ {
  304. cc := te.clientConn()
  305. te.cc = nil
  306. ccs = append(ccs, cc)
  307. }
  308. var svrID int64
  309. if err := verifyResultWithDelay(func() (bool, error) {
  310. ss, _ := channelz.GetServers(0, 0)
  311. if len(ss) != 1 {
  312. return false, fmt.Errorf("there should only be one server, not %d", len(ss))
  313. }
  314. if len(ss[0].ListenSockets) != 1 {
  315. return false, fmt.Errorf("there should only be one server listen socket, not %d", len(ss[0].ListenSockets))
  316. }
  317. startID := c.start
  318. if startID != 0 {
  319. ns, _ := channelz.GetServerSockets(ss[0].ID, 0, int64(c.total))
  320. if int64(len(ns)) < c.start {
  321. return false, fmt.Errorf("there should more than %d sockets, not %d", len(ns), c.start)
  322. }
  323. startID = ns[c.start-1].ID + 1
  324. }
  325. ns, end := channelz.GetServerSockets(ss[0].ID, startID, c.max)
  326. if int64(len(ns)) != c.length || end != c.end {
  327. return false, fmt.Errorf("GetServerSockets(%d) = %+v (len of which: %d), end: %+v, want len(GetServerSockets(%d)) = %d, end: %+v", c.start, ns, len(ns), end, c.start, c.length, c.end)
  328. }
  329. svrID = ss[0].ID
  330. return true, nil
  331. }); err != nil {
  332. t.Fatal(err)
  333. }
  334. for _, cc := range ccs {
  335. cc.Close()
  336. }
  337. if err := verifyResultWithDelay(func() (bool, error) {
  338. ns, _ := channelz.GetServerSockets(svrID, c.start, c.max)
  339. if len(ns) != 0 {
  340. return false, fmt.Errorf("there should be %d normal sockets not %d", 0, len(ns))
  341. }
  342. return true, nil
  343. }); err != nil {
  344. t.Fatal(err)
  345. }
  346. }
  347. }
  348. func (s) TestCZServerListenSocketDeletion(t *testing.T) {
  349. channelz.NewChannelzStorage()
  350. s := grpc.NewServer()
  351. lis, err := net.Listen("tcp", "localhost:0")
  352. if err != nil {
  353. t.Fatalf("failed to listen: %v", err)
  354. }
  355. go s.Serve(lis)
  356. if err := verifyResultWithDelay(func() (bool, error) {
  357. ss, _ := channelz.GetServers(0, 0)
  358. if len(ss) != 1 {
  359. return false, fmt.Errorf("there should only be one server, not %d", len(ss))
  360. }
  361. if len(ss[0].ListenSockets) != 1 {
  362. return false, fmt.Errorf("there should only be one server listen socket, not %d", len(ss[0].ListenSockets))
  363. }
  364. return true, nil
  365. }); err != nil {
  366. t.Fatal(err)
  367. }
  368. lis.Close()
  369. if err := verifyResultWithDelay(func() (bool, error) {
  370. ss, _ := channelz.GetServers(0, 0)
  371. if len(ss) != 1 {
  372. return false, fmt.Errorf("there should be 1 server, not %d", len(ss))
  373. }
  374. if len(ss[0].ListenSockets) != 0 {
  375. return false, fmt.Errorf("there should only be %d server listen socket, not %d", 0, len(ss[0].ListenSockets))
  376. }
  377. return true, nil
  378. }); err != nil {
  379. t.Fatal(err)
  380. }
  381. s.Stop()
  382. }
  383. type dummyChannel struct{}
  384. func (d *dummyChannel) ChannelzMetric() *channelz.ChannelInternalMetric {
  385. return &channelz.ChannelInternalMetric{}
  386. }
  387. type dummySocket struct{}
  388. func (d *dummySocket) ChannelzMetric() *channelz.SocketInternalMetric {
  389. return &channelz.SocketInternalMetric{}
  390. }
  391. func (s) TestCZRecusivelyDeletionOfEntry(t *testing.T) {
  392. // +--+TopChan+---+
  393. // | |
  394. // v v
  395. // +-+SubChan1+--+ SubChan2
  396. // | |
  397. // v v
  398. // Socket1 Socket2
  399. channelz.NewChannelzStorage()
  400. topChanID := channelz.RegisterChannel(&dummyChannel{}, 0, "")
  401. subChanID1 := channelz.RegisterSubChannel(&dummyChannel{}, topChanID, "")
  402. subChanID2 := channelz.RegisterSubChannel(&dummyChannel{}, topChanID, "")
  403. sktID1 := channelz.RegisterNormalSocket(&dummySocket{}, subChanID1, "")
  404. sktID2 := channelz.RegisterNormalSocket(&dummySocket{}, subChanID1, "")
  405. tcs, _ := channelz.GetTopChannels(0, 0)
  406. if tcs == nil || len(tcs) != 1 {
  407. t.Fatalf("There should be one TopChannel entry")
  408. }
  409. if len(tcs[0].SubChans) != 2 {
  410. t.Fatalf("There should be two SubChannel entries")
  411. }
  412. sc := channelz.GetSubChannel(subChanID1)
  413. if sc == nil || len(sc.Sockets) != 2 {
  414. t.Fatalf("There should be two Socket entries")
  415. }
  416. channelz.RemoveEntry(topChanID)
  417. tcs, _ = channelz.GetTopChannels(0, 0)
  418. if tcs == nil || len(tcs) != 1 {
  419. t.Fatalf("There should be one TopChannel entry")
  420. }
  421. channelz.RemoveEntry(subChanID1)
  422. channelz.RemoveEntry(subChanID2)
  423. tcs, _ = channelz.GetTopChannels(0, 0)
  424. if tcs == nil || len(tcs) != 1 {
  425. t.Fatalf("There should be one TopChannel entry")
  426. }
  427. if len(tcs[0].SubChans) != 1 {
  428. t.Fatalf("There should be one SubChannel entry")
  429. }
  430. channelz.RemoveEntry(sktID1)
  431. channelz.RemoveEntry(sktID2)
  432. tcs, _ = channelz.GetTopChannels(0, 0)
  433. if tcs != nil {
  434. t.Fatalf("There should be no TopChannel entry")
  435. }
  436. }
  437. func (s) TestCZChannelMetrics(t *testing.T) {
  438. channelz.NewChannelzStorage()
  439. e := tcpClearRREnv
  440. num := 3 // number of backends
  441. te := newTest(t, e)
  442. te.maxClientSendMsgSize = newInt(8)
  443. var svrAddrs []resolver.Address
  444. te.startServers(&testServer{security: e.security}, num)
  445. r, cleanup := manual.GenerateAndRegisterManualResolver()
  446. defer cleanup()
  447. for _, a := range te.srvAddrs {
  448. svrAddrs = append(svrAddrs, resolver.Address{Addr: a})
  449. }
  450. r.InitialAddrs(svrAddrs)
  451. te.resolverScheme = r.Scheme()
  452. cc := te.clientConn()
  453. defer te.tearDown()
  454. tc := testpb.NewTestServiceClient(cc)
  455. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
  456. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err)
  457. }
  458. const smallSize = 1
  459. const largeSize = 8
  460. largePayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, largeSize)
  461. if err != nil {
  462. t.Fatal(err)
  463. }
  464. req := &testpb.SimpleRequest{
  465. ResponseType: testpb.PayloadType_COMPRESSABLE,
  466. ResponseSize: int32(smallSize),
  467. Payload: largePayload,
  468. }
  469. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  470. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  471. }
  472. stream, err := tc.FullDuplexCall(context.Background())
  473. if err != nil {
  474. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  475. }
  476. defer stream.CloseSend()
  477. // Here, we just wait for all sockets to be up. In the future, if we implement
  478. // IDLE, we may need to make several rpc calls to create the sockets.
  479. if err := verifyResultWithDelay(func() (bool, error) {
  480. tcs, _ := channelz.GetTopChannels(0, 0)
  481. if len(tcs) != 1 {
  482. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  483. }
  484. if len(tcs[0].SubChans) != num {
  485. return false, fmt.Errorf("there should be %d subchannel not %d", num, len(tcs[0].SubChans))
  486. }
  487. var cst, csu, cf int64
  488. for k := range tcs[0].SubChans {
  489. sc := channelz.GetSubChannel(k)
  490. if sc == nil {
  491. return false, fmt.Errorf("got <nil> subchannel")
  492. }
  493. cst += sc.ChannelData.CallsStarted
  494. csu += sc.ChannelData.CallsSucceeded
  495. cf += sc.ChannelData.CallsFailed
  496. }
  497. if cst != 3 {
  498. return false, fmt.Errorf("there should be 3 CallsStarted not %d", cst)
  499. }
  500. if csu != 1 {
  501. return false, fmt.Errorf("there should be 1 CallsSucceeded not %d", csu)
  502. }
  503. if cf != 1 {
  504. return false, fmt.Errorf("there should be 1 CallsFailed not %d", cf)
  505. }
  506. if tcs[0].ChannelData.CallsStarted != 3 {
  507. return false, fmt.Errorf("there should be 3 CallsStarted not %d", tcs[0].ChannelData.CallsStarted)
  508. }
  509. if tcs[0].ChannelData.CallsSucceeded != 1 {
  510. return false, fmt.Errorf("there should be 1 CallsSucceeded not %d", tcs[0].ChannelData.CallsSucceeded)
  511. }
  512. if tcs[0].ChannelData.CallsFailed != 1 {
  513. return false, fmt.Errorf("there should be 1 CallsFailed not %d", tcs[0].ChannelData.CallsFailed)
  514. }
  515. return true, nil
  516. }); err != nil {
  517. t.Fatal(err)
  518. }
  519. }
  520. func (s) TestCZServerMetrics(t *testing.T) {
  521. channelz.NewChannelzStorage()
  522. e := tcpClearRREnv
  523. te := newTest(t, e)
  524. te.maxServerReceiveMsgSize = newInt(8)
  525. te.startServer(&testServer{security: e.security})
  526. defer te.tearDown()
  527. cc := te.clientConn()
  528. tc := testpb.NewTestServiceClient(cc)
  529. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
  530. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err)
  531. }
  532. const smallSize = 1
  533. const largeSize = 8
  534. largePayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, largeSize)
  535. if err != nil {
  536. t.Fatal(err)
  537. }
  538. req := &testpb.SimpleRequest{
  539. ResponseType: testpb.PayloadType_COMPRESSABLE,
  540. ResponseSize: int32(smallSize),
  541. Payload: largePayload,
  542. }
  543. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  544. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  545. }
  546. stream, err := tc.FullDuplexCall(context.Background())
  547. if err != nil {
  548. t.Fatalf("%v.FullDuplexCall(_) = _, %v, want <nil>", tc, err)
  549. }
  550. defer stream.CloseSend()
  551. if err := verifyResultWithDelay(func() (bool, error) {
  552. ss, _ := channelz.GetServers(0, 0)
  553. if len(ss) != 1 {
  554. return false, fmt.Errorf("there should only be one server, not %d", len(ss))
  555. }
  556. if ss[0].ServerData.CallsStarted != 3 {
  557. return false, fmt.Errorf("there should be 3 CallsStarted not %d", ss[0].ServerData.CallsStarted)
  558. }
  559. if ss[0].ServerData.CallsSucceeded != 1 {
  560. return false, fmt.Errorf("there should be 1 CallsSucceeded not %d", ss[0].ServerData.CallsSucceeded)
  561. }
  562. if ss[0].ServerData.CallsFailed != 1 {
  563. return false, fmt.Errorf("there should be 1 CallsFailed not %d", ss[0].ServerData.CallsFailed)
  564. }
  565. return true, nil
  566. }); err != nil {
  567. t.Fatal(err)
  568. }
  569. }
  570. type testServiceClientWrapper struct {
  571. testpb.TestServiceClient
  572. mu sync.RWMutex
  573. streamsCreated int
  574. }
  575. func (t *testServiceClientWrapper) getCurrentStreamID() uint32 {
  576. t.mu.RLock()
  577. defer t.mu.RUnlock()
  578. return uint32(2*t.streamsCreated - 1)
  579. }
  580. func (t *testServiceClientWrapper) EmptyCall(ctx context.Context, in *testpb.Empty, opts ...grpc.CallOption) (*testpb.Empty, error) {
  581. t.mu.Lock()
  582. defer t.mu.Unlock()
  583. t.streamsCreated++
  584. return t.TestServiceClient.EmptyCall(ctx, in, opts...)
  585. }
  586. func (t *testServiceClientWrapper) UnaryCall(ctx context.Context, in *testpb.SimpleRequest, opts ...grpc.CallOption) (*testpb.SimpleResponse, error) {
  587. t.mu.Lock()
  588. defer t.mu.Unlock()
  589. t.streamsCreated++
  590. return t.TestServiceClient.UnaryCall(ctx, in, opts...)
  591. }
  592. func (t *testServiceClientWrapper) StreamingOutputCall(ctx context.Context, in *testpb.StreamingOutputCallRequest, opts ...grpc.CallOption) (testpb.TestService_StreamingOutputCallClient, error) {
  593. t.mu.Lock()
  594. defer t.mu.Unlock()
  595. t.streamsCreated++
  596. return t.TestServiceClient.StreamingOutputCall(ctx, in, opts...)
  597. }
  598. func (t *testServiceClientWrapper) StreamingInputCall(ctx context.Context, opts ...grpc.CallOption) (testpb.TestService_StreamingInputCallClient, error) {
  599. t.mu.Lock()
  600. defer t.mu.Unlock()
  601. t.streamsCreated++
  602. return t.TestServiceClient.StreamingInputCall(ctx, opts...)
  603. }
  604. func (t *testServiceClientWrapper) FullDuplexCall(ctx context.Context, opts ...grpc.CallOption) (testpb.TestService_FullDuplexCallClient, error) {
  605. t.mu.Lock()
  606. defer t.mu.Unlock()
  607. t.streamsCreated++
  608. return t.TestServiceClient.FullDuplexCall(ctx, opts...)
  609. }
  610. func (t *testServiceClientWrapper) HalfDuplexCall(ctx context.Context, opts ...grpc.CallOption) (testpb.TestService_HalfDuplexCallClient, error) {
  611. t.mu.Lock()
  612. defer t.mu.Unlock()
  613. t.streamsCreated++
  614. return t.TestServiceClient.HalfDuplexCall(ctx, opts...)
  615. }
  616. func doSuccessfulUnaryCall(tc testpb.TestServiceClient, t *testing.T) {
  617. if _, err := tc.EmptyCall(context.Background(), &testpb.Empty{}); err != nil {
  618. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err)
  619. }
  620. }
  621. func doStreamingInputCallWithLargePayload(tc testpb.TestServiceClient, t *testing.T) {
  622. s, err := tc.StreamingInputCall(context.Background())
  623. if err != nil {
  624. t.Fatalf("TestService/StreamingInputCall(_) = _, %v, want <nil>", err)
  625. }
  626. payload, err := newPayload(testpb.PayloadType_COMPRESSABLE, 10000)
  627. if err != nil {
  628. t.Fatal(err)
  629. }
  630. s.Send(&testpb.StreamingInputCallRequest{Payload: payload})
  631. }
  632. func doServerSideFailedUnaryCall(tc testpb.TestServiceClient, t *testing.T) {
  633. const smallSize = 1
  634. const largeSize = 2000
  635. largePayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, largeSize)
  636. if err != nil {
  637. t.Fatal(err)
  638. }
  639. req := &testpb.SimpleRequest{
  640. ResponseType: testpb.PayloadType_COMPRESSABLE,
  641. ResponseSize: int32(smallSize),
  642. Payload: largePayload,
  643. }
  644. if _, err := tc.UnaryCall(context.Background(), req); err == nil || status.Code(err) != codes.ResourceExhausted {
  645. t.Fatalf("TestService/UnaryCall(_, _) = _, %v, want _, error code: %s", err, codes.ResourceExhausted)
  646. }
  647. }
  648. func doClientSideInitiatedFailedStream(tc testpb.TestServiceClient, t *testing.T) {
  649. ctx, cancel := context.WithCancel(context.Background())
  650. stream, err := tc.FullDuplexCall(ctx)
  651. if err != nil {
  652. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want <nil>", err)
  653. }
  654. const smallSize = 1
  655. smallPayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, smallSize)
  656. if err != nil {
  657. t.Fatal(err)
  658. }
  659. sreq := &testpb.StreamingOutputCallRequest{
  660. ResponseType: testpb.PayloadType_COMPRESSABLE,
  661. ResponseParameters: []*testpb.ResponseParameters{
  662. {Size: smallSize},
  663. },
  664. Payload: smallPayload,
  665. }
  666. if err := stream.Send(sreq); err != nil {
  667. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  668. }
  669. if _, err := stream.Recv(); err != nil {
  670. t.Fatalf("%v.Recv() = %v, want <nil>", stream, err)
  671. }
  672. // By canceling the call, the client will send rst_stream to end the call, and
  673. // the stream will failed as a result.
  674. cancel()
  675. }
  676. // This func is to be used to test client side counting of failed streams.
  677. func doServerSideInitiatedFailedStreamWithRSTStream(tc testpb.TestServiceClient, t *testing.T, l *listenerWrapper) {
  678. stream, err := tc.FullDuplexCall(context.Background())
  679. if err != nil {
  680. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want <nil>", err)
  681. }
  682. const smallSize = 1
  683. smallPayload, err := newPayload(testpb.PayloadType_COMPRESSABLE, smallSize)
  684. if err != nil {
  685. t.Fatal(err)
  686. }
  687. sreq := &testpb.StreamingOutputCallRequest{
  688. ResponseType: testpb.PayloadType_COMPRESSABLE,
  689. ResponseParameters: []*testpb.ResponseParameters{
  690. {Size: smallSize},
  691. },
  692. Payload: smallPayload,
  693. }
  694. if err := stream.Send(sreq); err != nil {
  695. t.Fatalf("%v.Send(%v) = %v, want <nil>", stream, sreq, err)
  696. }
  697. if _, err := stream.Recv(); err != nil {
  698. t.Fatalf("%v.Recv() = %v, want <nil>", stream, err)
  699. }
  700. rcw := l.getLastConn()
  701. if rcw != nil {
  702. rcw.writeRSTStream(tc.(*testServiceClientWrapper).getCurrentStreamID(), http2.ErrCodeCancel)
  703. }
  704. if _, err := stream.Recv(); err == nil {
  705. t.Fatalf("%v.Recv() = %v, want <non-nil>", stream, err)
  706. }
  707. }
  708. // this func is to be used to test client side counting of failed streams.
  709. func doServerSideInitiatedFailedStreamWithGoAway(tc testpb.TestServiceClient, t *testing.T, l *listenerWrapper) {
  710. // This call is just to keep the transport from shutting down (socket will be deleted
  711. // in this case, and we will not be able to get metrics).
  712. s, err := tc.FullDuplexCall(context.Background())
  713. if err != nil {
  714. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want <nil>", err)
  715. }
  716. if err := s.Send(&testpb.StreamingOutputCallRequest{ResponseParameters: []*testpb.ResponseParameters{
  717. {
  718. Size: 1,
  719. },
  720. }}); err != nil {
  721. t.Fatalf("s.Send() failed with error: %v", err)
  722. }
  723. if _, err := s.Recv(); err != nil {
  724. t.Fatalf("s.Recv() failed with error: %v", err)
  725. }
  726. s, err = tc.FullDuplexCall(context.Background())
  727. if err != nil {
  728. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want <nil>", err)
  729. }
  730. if err := s.Send(&testpb.StreamingOutputCallRequest{ResponseParameters: []*testpb.ResponseParameters{
  731. {
  732. Size: 1,
  733. },
  734. }}); err != nil {
  735. t.Fatalf("s.Send() failed with error: %v", err)
  736. }
  737. if _, err := s.Recv(); err != nil {
  738. t.Fatalf("s.Recv() failed with error: %v", err)
  739. }
  740. rcw := l.getLastConn()
  741. if rcw != nil {
  742. rcw.writeGoAway(tc.(*testServiceClientWrapper).getCurrentStreamID()-2, http2.ErrCodeCancel, []byte{})
  743. }
  744. if _, err := s.Recv(); err == nil {
  745. t.Fatalf("%v.Recv() = %v, want <non-nil>", s, err)
  746. }
  747. }
  748. // this func is to be used to test client side counting of failed streams.
  749. func doServerSideInitiatedFailedStreamWithClientBreakFlowControl(tc testpb.TestServiceClient, t *testing.T, dw *dialerWrapper) {
  750. stream, err := tc.FullDuplexCall(context.Background())
  751. if err != nil {
  752. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want <nil>", err)
  753. }
  754. // sleep here to make sure header frame being sent before the data frame we write directly below.
  755. time.Sleep(10 * time.Millisecond)
  756. payload := make([]byte, 65537)
  757. dw.getRawConnWrapper().writeRawFrame(http2.FrameData, 0, tc.(*testServiceClientWrapper).getCurrentStreamID(), payload)
  758. if _, err := stream.Recv(); err == nil || status.Code(err) != codes.ResourceExhausted {
  759. t.Fatalf("%v.Recv() = %v, want error code: %v", stream, err, codes.ResourceExhausted)
  760. }
  761. }
  762. func doIdleCallToInvokeKeepAlive(tc testpb.TestServiceClient, t *testing.T) {
  763. ctx, cancel := context.WithCancel(context.Background())
  764. _, err := tc.FullDuplexCall(ctx)
  765. if err != nil {
  766. t.Fatalf("TestService/FullDuplexCall(_) = _, %v, want <nil>", err)
  767. }
  768. // Allow for at least 2 keepalives (1s per ping interval)
  769. time.Sleep(4 * time.Second)
  770. cancel()
  771. }
  772. func (s) TestCZClientSocketMetricsStreamsAndMessagesCount(t *testing.T) {
  773. channelz.NewChannelzStorage()
  774. e := tcpClearRREnv
  775. te := newTest(t, e)
  776. te.maxServerReceiveMsgSize = newInt(20)
  777. te.maxClientReceiveMsgSize = newInt(20)
  778. rcw := te.startServerWithConnControl(&testServer{security: e.security})
  779. defer te.tearDown()
  780. cc := te.clientConn()
  781. tc := &testServiceClientWrapper{TestServiceClient: testpb.NewTestServiceClient(cc)}
  782. doSuccessfulUnaryCall(tc, t)
  783. var scID, skID int64
  784. if err := verifyResultWithDelay(func() (bool, error) {
  785. tchan, _ := channelz.GetTopChannels(0, 0)
  786. if len(tchan) != 1 {
  787. return false, fmt.Errorf("there should only be one top channel, not %d", len(tchan))
  788. }
  789. if len(tchan[0].SubChans) != 1 {
  790. return false, fmt.Errorf("there should only be one subchannel under top channel %d, not %d", tchan[0].ID, len(tchan[0].SubChans))
  791. }
  792. for scID = range tchan[0].SubChans {
  793. break
  794. }
  795. sc := channelz.GetSubChannel(scID)
  796. if sc == nil {
  797. return false, fmt.Errorf("there should only be one socket under subchannel %d, not 0", scID)
  798. }
  799. if len(sc.Sockets) != 1 {
  800. return false, fmt.Errorf("there should only be one socket under subchannel %d, not %d", sc.ID, len(sc.Sockets))
  801. }
  802. for skID = range sc.Sockets {
  803. break
  804. }
  805. skt := channelz.GetSocket(skID)
  806. sktData := skt.SocketData
  807. if sktData.StreamsStarted != 1 || sktData.StreamsSucceeded != 1 || sktData.MessagesSent != 1 || sktData.MessagesReceived != 1 {
  808. return false, fmt.Errorf("channelz.GetSocket(%d), want (StreamsStarted, StreamsSucceeded, MessagesSent, MessagesReceived) = (1, 1, 1, 1), got (%d, %d, %d, %d)", skt.ID, sktData.StreamsStarted, sktData.StreamsSucceeded, sktData.MessagesSent, sktData.MessagesReceived)
  809. }
  810. return true, nil
  811. }); err != nil {
  812. t.Fatal(err)
  813. }
  814. doServerSideFailedUnaryCall(tc, t)
  815. if err := verifyResultWithDelay(func() (bool, error) {
  816. skt := channelz.GetSocket(skID)
  817. sktData := skt.SocketData
  818. if sktData.StreamsStarted != 2 || sktData.StreamsSucceeded != 2 || sktData.MessagesSent != 2 || sktData.MessagesReceived != 1 {
  819. return false, fmt.Errorf("channelz.GetSocket(%d), want (StreamsStarted, StreamsSucceeded, MessagesSent, MessagesReceived) = (2, 2, 2, 1), got (%d, %d, %d, %d)", skt.ID, sktData.StreamsStarted, sktData.StreamsSucceeded, sktData.MessagesSent, sktData.MessagesReceived)
  820. }
  821. return true, nil
  822. }); err != nil {
  823. t.Fatal(err)
  824. }
  825. doClientSideInitiatedFailedStream(tc, t)
  826. if err := verifyResultWithDelay(func() (bool, error) {
  827. skt := channelz.GetSocket(skID)
  828. sktData := skt.SocketData
  829. if sktData.StreamsStarted != 3 || sktData.StreamsSucceeded != 2 || sktData.StreamsFailed != 1 || sktData.MessagesSent != 3 || sktData.MessagesReceived != 2 {
  830. return false, fmt.Errorf("channelz.GetSocket(%d), want (StreamsStarted, StreamsSucceeded, StreamsFailed, MessagesSent, MessagesReceived) = (3, 2, 1, 3, 2), got (%d, %d, %d, %d, %d)", skt.ID, sktData.StreamsStarted, sktData.StreamsSucceeded, sktData.StreamsFailed, sktData.MessagesSent, sktData.MessagesReceived)
  831. }
  832. return true, nil
  833. }); err != nil {
  834. t.Fatal(err)
  835. }
  836. doServerSideInitiatedFailedStreamWithRSTStream(tc, t, rcw)
  837. if err := verifyResultWithDelay(func() (bool, error) {
  838. skt := channelz.GetSocket(skID)
  839. sktData := skt.SocketData
  840. if sktData.StreamsStarted != 4 || sktData.StreamsSucceeded != 2 || sktData.StreamsFailed != 2 || sktData.MessagesSent != 4 || sktData.MessagesReceived != 3 {
  841. return false, fmt.Errorf("channelz.GetSocket(%d), want (StreamsStarted, StreamsSucceeded, StreamsFailed, MessagesSent, MessagesReceived) = (4, 2, 2, 4, 3), got (%d, %d, %d, %d, %d)", skt.ID, sktData.StreamsStarted, sktData.StreamsSucceeded, sktData.StreamsFailed, sktData.MessagesSent, sktData.MessagesReceived)
  842. }
  843. return true, nil
  844. }); err != nil {
  845. t.Fatal(err)
  846. }
  847. doServerSideInitiatedFailedStreamWithGoAway(tc, t, rcw)
  848. if err := verifyResultWithDelay(func() (bool, error) {
  849. skt := channelz.GetSocket(skID)
  850. sktData := skt.SocketData
  851. if sktData.StreamsStarted != 6 || sktData.StreamsSucceeded != 2 || sktData.StreamsFailed != 3 || sktData.MessagesSent != 6 || sktData.MessagesReceived != 5 {
  852. return false, fmt.Errorf("channelz.GetSocket(%d), want (StreamsStarted, StreamsSucceeded, StreamsFailed, MessagesSent, MessagesReceived) = (6, 2, 3, 6, 5), got (%d, %d, %d, %d, %d)", skt.ID, sktData.StreamsStarted, sktData.StreamsSucceeded, sktData.StreamsFailed, sktData.MessagesSent, sktData.MessagesReceived)
  853. }
  854. return true, nil
  855. }); err != nil {
  856. t.Fatal(err)
  857. }
  858. }
  859. // This test is to complete TestCZClientSocketMetricsStreamsAndMessagesCount and
  860. // TestCZServerSocketMetricsStreamsAndMessagesCount by adding the test case of
  861. // server sending RST_STREAM to client due to client side flow control violation.
  862. // It is separated from other cases due to setup incompatibly, i.e. max receive
  863. // size violation will mask flow control violation.
  864. func (s) TestCZClientAndServerSocketMetricsStreamsCountFlowControlRSTStream(t *testing.T) {
  865. channelz.NewChannelzStorage()
  866. e := tcpClearRREnv
  867. te := newTest(t, e)
  868. te.serverInitialWindowSize = 65536
  869. // Avoid overflowing connection level flow control window, which will lead to
  870. // transport being closed.
  871. te.serverInitialConnWindowSize = 65536 * 2
  872. te.startServer(&testServer{security: e.security})
  873. defer te.tearDown()
  874. cc, dw := te.clientConnWithConnControl()
  875. tc := &testServiceClientWrapper{TestServiceClient: testpb.NewTestServiceClient(cc)}
  876. doServerSideInitiatedFailedStreamWithClientBreakFlowControl(tc, t, dw)
  877. if err := verifyResultWithDelay(func() (bool, error) {
  878. tchan, _ := channelz.GetTopChannels(0, 0)
  879. if len(tchan) != 1 {
  880. return false, fmt.Errorf("there should only be one top channel, not %d", len(tchan))
  881. }
  882. if len(tchan[0].SubChans) != 1 {
  883. return false, fmt.Errorf("there should only be one subchannel under top channel %d, not %d", tchan[0].ID, len(tchan[0].SubChans))
  884. }
  885. var id int64
  886. for id = range tchan[0].SubChans {
  887. break
  888. }
  889. sc := channelz.GetSubChannel(id)
  890. if sc == nil {
  891. return false, fmt.Errorf("there should only be one socket under subchannel %d, not 0", id)
  892. }
  893. if len(sc.Sockets) != 1 {
  894. return false, fmt.Errorf("there should only be one socket under subchannel %d, not %d", sc.ID, len(sc.Sockets))
  895. }
  896. for id = range sc.Sockets {
  897. break
  898. }
  899. skt := channelz.GetSocket(id)
  900. sktData := skt.SocketData
  901. if sktData.StreamsStarted != 1 || sktData.StreamsSucceeded != 0 || sktData.StreamsFailed != 1 {
  902. return false, fmt.Errorf("channelz.GetSocket(%d), want (StreamsStarted, StreamsSucceeded, StreamsFailed) = (1, 0, 1), got (%d, %d, %d)", skt.ID, sktData.StreamsStarted, sktData.StreamsSucceeded, sktData.StreamsFailed)
  903. }
  904. ss, _ := channelz.GetServers(0, 0)
  905. if len(ss) != 1 {
  906. return false, fmt.Errorf("there should only be one server, not %d", len(ss))
  907. }
  908. ns, _ := channelz.GetServerSockets(ss[0].ID, 0, 0)
  909. if len(ns) != 1 {
  910. return false, fmt.Errorf("there should be one server normal socket, not %d", len(ns))
  911. }
  912. sktData = ns[0].SocketData
  913. if sktData.StreamsStarted != 1 || sktData.StreamsSucceeded != 0 || sktData.StreamsFailed != 1 {
  914. return false, fmt.Errorf("server socket metric with ID %d, want (StreamsStarted, StreamsSucceeded, StreamsFailed) = (1, 0, 1), got (%d, %d, %d)", ns[0].ID, sktData.StreamsStarted, sktData.StreamsSucceeded, sktData.StreamsFailed)
  915. }
  916. return true, nil
  917. }); err != nil {
  918. t.Fatal(err)
  919. }
  920. }
  921. func (s) TestCZClientAndServerSocketMetricsFlowControl(t *testing.T) {
  922. channelz.NewChannelzStorage()
  923. e := tcpClearRREnv
  924. te := newTest(t, e)
  925. // disable BDP
  926. te.serverInitialWindowSize = 65536
  927. te.serverInitialConnWindowSize = 65536
  928. te.clientInitialWindowSize = 65536
  929. te.clientInitialConnWindowSize = 65536
  930. te.startServer(&testServer{security: e.security})
  931. defer te.tearDown()
  932. cc := te.clientConn()
  933. tc := testpb.NewTestServiceClient(cc)
  934. for i := 0; i < 10; i++ {
  935. doSuccessfulUnaryCall(tc, t)
  936. }
  937. var cliSktID, svrSktID int64
  938. if err := verifyResultWithDelay(func() (bool, error) {
  939. tchan, _ := channelz.GetTopChannels(0, 0)
  940. if len(tchan) != 1 {
  941. return false, fmt.Errorf("there should only be one top channel, not %d", len(tchan))
  942. }
  943. if len(tchan[0].SubChans) != 1 {
  944. return false, fmt.Errorf("there should only be one subchannel under top channel %d, not %d", tchan[0].ID, len(tchan[0].SubChans))
  945. }
  946. var id int64
  947. for id = range tchan[0].SubChans {
  948. break
  949. }
  950. sc := channelz.GetSubChannel(id)
  951. if sc == nil {
  952. return false, fmt.Errorf("there should only be one socket under subchannel %d, not 0", id)
  953. }
  954. if len(sc.Sockets) != 1 {
  955. return false, fmt.Errorf("there should only be one socket under subchannel %d, not %d", sc.ID, len(sc.Sockets))
  956. }
  957. for id = range sc.Sockets {
  958. break
  959. }
  960. skt := channelz.GetSocket(id)
  961. sktData := skt.SocketData
  962. // 65536 - 5 (Length-Prefixed-Message size) * 10 = 65486
  963. if sktData.LocalFlowControlWindow != 65486 || sktData.RemoteFlowControlWindow != 65486 {
  964. return false, fmt.Errorf("client: (LocalFlowControlWindow, RemoteFlowControlWindow) size should be (65536, 65486), not (%d, %d)", sktData.LocalFlowControlWindow, sktData.RemoteFlowControlWindow)
  965. }
  966. ss, _ := channelz.GetServers(0, 0)
  967. if len(ss) != 1 {
  968. return false, fmt.Errorf("there should only be one server, not %d", len(ss))
  969. }
  970. ns, _ := channelz.GetServerSockets(ss[0].ID, 0, 0)
  971. sktData = ns[0].SocketData
  972. if sktData.LocalFlowControlWindow != 65486 || sktData.RemoteFlowControlWindow != 65486 {
  973. return false, fmt.Errorf("server: (LocalFlowControlWindow, RemoteFlowControlWindow) size should be (65536, 65486), not (%d, %d)", sktData.LocalFlowControlWindow, sktData.RemoteFlowControlWindow)
  974. }
  975. cliSktID, svrSktID = id, ss[0].ID
  976. return true, nil
  977. }); err != nil {
  978. t.Fatal(err)
  979. }
  980. doStreamingInputCallWithLargePayload(tc, t)
  981. if err := verifyResultWithDelay(func() (bool, error) {
  982. skt := channelz.GetSocket(cliSktID)
  983. sktData := skt.SocketData
  984. // Local: 65536 - 5 (Length-Prefixed-Message size) * 10 = 65486
  985. // Remote: 65536 - 5 (Length-Prefixed-Message size) * 10 - 10011 = 55475
  986. if sktData.LocalFlowControlWindow != 65486 || sktData.RemoteFlowControlWindow != 55475 {
  987. return false, fmt.Errorf("client: (LocalFlowControlWindow, RemoteFlowControlWindow) size should be (65486, 55475), not (%d, %d)", sktData.LocalFlowControlWindow, sktData.RemoteFlowControlWindow)
  988. }
  989. ss, _ := channelz.GetServers(0, 0)
  990. if len(ss) != 1 {
  991. return false, fmt.Errorf("there should only be one server, not %d", len(ss))
  992. }
  993. ns, _ := channelz.GetServerSockets(svrSktID, 0, 0)
  994. sktData = ns[0].SocketData
  995. if sktData.LocalFlowControlWindow != 55475 || sktData.RemoteFlowControlWindow != 65486 {
  996. return false, fmt.Errorf("server: (LocalFlowControlWindow, RemoteFlowControlWindow) size should be (55475, 65486), not (%d, %d)", sktData.LocalFlowControlWindow, sktData.RemoteFlowControlWindow)
  997. }
  998. return true, nil
  999. }); err != nil {
  1000. t.Fatal(err)
  1001. }
  1002. // triggers transport flow control window update on server side, since unacked
  1003. // bytes should be larger than limit now. i.e. 50 + 20022 > 65536/4.
  1004. doStreamingInputCallWithLargePayload(tc, t)
  1005. if err := verifyResultWithDelay(func() (bool, error) {
  1006. skt := channelz.GetSocket(cliSktID)
  1007. sktData := skt.SocketData
  1008. // Local: 65536 - 5 (Length-Prefixed-Message size) * 10 = 65486
  1009. // Remote: 65536
  1010. if sktData.LocalFlowControlWindow != 65486 || sktData.RemoteFlowControlWindow != 65536 {
  1011. return false, fmt.Errorf("client: (LocalFlowControlWindow, RemoteFlowControlWindow) size should be (65486, 65536), not (%d, %d)", sktData.LocalFlowControlWindow, sktData.RemoteFlowControlWindow)
  1012. }
  1013. ss, _ := channelz.GetServers(0, 0)
  1014. if len(ss) != 1 {
  1015. return false, fmt.Errorf("there should only be one server, not %d", len(ss))
  1016. }
  1017. ns, _ := channelz.GetServerSockets(svrSktID, 0, 0)
  1018. sktData = ns[0].SocketData
  1019. if sktData.LocalFlowControlWindow != 65536 || sktData.RemoteFlowControlWindow != 65486 {
  1020. return false, fmt.Errorf("server: (LocalFlowControlWindow, RemoteFlowControlWindow) size should be (65536, 65486), not (%d, %d)", sktData.LocalFlowControlWindow, sktData.RemoteFlowControlWindow)
  1021. }
  1022. return true, nil
  1023. }); err != nil {
  1024. t.Fatal(err)
  1025. }
  1026. }
  1027. func (s) TestCZClientSocketMetricsKeepAlive(t *testing.T) {
  1028. channelz.NewChannelzStorage()
  1029. defer func(t time.Duration) { internal.KeepaliveMinPingTime = t }(internal.KeepaliveMinPingTime)
  1030. internal.KeepaliveMinPingTime = time.Second
  1031. e := tcpClearRREnv
  1032. te := newTest(t, e)
  1033. te.customDialOptions = append(te.customDialOptions, grpc.WithKeepaliveParams(
  1034. keepalive.ClientParameters{
  1035. Time: time.Second,
  1036. Timeout: 500 * time.Millisecond,
  1037. PermitWithoutStream: true,
  1038. }))
  1039. te.customServerOptions = append(te.customServerOptions, grpc.KeepaliveEnforcementPolicy(
  1040. keepalive.EnforcementPolicy{
  1041. MinTime: 500 * time.Millisecond,
  1042. PermitWithoutStream: true,
  1043. }))
  1044. te.startServer(&testServer{security: e.security})
  1045. te.clientConn() // Dial the server
  1046. defer te.tearDown()
  1047. if err := verifyResultWithDelay(func() (bool, error) {
  1048. tchan, _ := channelz.GetTopChannels(0, 0)
  1049. if len(tchan) != 1 {
  1050. return false, fmt.Errorf("there should only be one top channel, not %d", len(tchan))
  1051. }
  1052. if len(tchan[0].SubChans) != 1 {
  1053. return false, fmt.Errorf("there should only be one subchannel under top channel %d, not %d", tchan[0].ID, len(tchan[0].SubChans))
  1054. }
  1055. var id int64
  1056. for id = range tchan[0].SubChans {
  1057. break
  1058. }
  1059. sc := channelz.GetSubChannel(id)
  1060. if sc == nil {
  1061. return false, fmt.Errorf("there should only be one socket under subchannel %d, not 0", id)
  1062. }
  1063. if len(sc.Sockets) != 1 {
  1064. return false, fmt.Errorf("there should only be one socket under subchannel %d, not %d", sc.ID, len(sc.Sockets))
  1065. }
  1066. for id = range sc.Sockets {
  1067. break
  1068. }
  1069. skt := channelz.GetSocket(id)
  1070. if skt.SocketData.KeepAlivesSent != 2 {
  1071. return false, fmt.Errorf("there should be 2 KeepAlives sent, not %d", skt.SocketData.KeepAlivesSent)
  1072. }
  1073. return true, nil
  1074. }); err != nil {
  1075. t.Fatal(err)
  1076. }
  1077. }
  1078. func (s) TestCZServerSocketMetricsStreamsAndMessagesCount(t *testing.T) {
  1079. channelz.NewChannelzStorage()
  1080. e := tcpClearRREnv
  1081. te := newTest(t, e)
  1082. te.maxServerReceiveMsgSize = newInt(20)
  1083. te.maxClientReceiveMsgSize = newInt(20)
  1084. te.startServer(&testServer{security: e.security})
  1085. defer te.tearDown()
  1086. cc, _ := te.clientConnWithConnControl()
  1087. tc := &testServiceClientWrapper{TestServiceClient: testpb.NewTestServiceClient(cc)}
  1088. var svrID int64
  1089. if err := verifyResultWithDelay(func() (bool, error) {
  1090. ss, _ := channelz.GetServers(0, 0)
  1091. if len(ss) != 1 {
  1092. return false, fmt.Errorf("there should only be one server, not %d", len(ss))
  1093. }
  1094. svrID = ss[0].ID
  1095. return true, nil
  1096. }); err != nil {
  1097. t.Fatal(err)
  1098. }
  1099. doSuccessfulUnaryCall(tc, t)
  1100. if err := verifyResultWithDelay(func() (bool, error) {
  1101. ns, _ := channelz.GetServerSockets(svrID, 0, 0)
  1102. sktData := ns[0].SocketData
  1103. if sktData.StreamsStarted != 1 || sktData.StreamsSucceeded != 1 || sktData.StreamsFailed != 0 || sktData.MessagesSent != 1 || sktData.MessagesReceived != 1 {
  1104. return false, fmt.Errorf("server socket metric with ID %d, want (StreamsStarted, StreamsSucceeded, MessagesSent, MessagesReceived) = (1, 1, 1, 1), got (%d, %d, %d, %d, %d)", ns[0].ID, sktData.StreamsStarted, sktData.StreamsSucceeded, sktData.StreamsFailed, sktData.MessagesSent, sktData.MessagesReceived)
  1105. }
  1106. return true, nil
  1107. }); err != nil {
  1108. t.Fatal(err)
  1109. }
  1110. doServerSideFailedUnaryCall(tc, t)
  1111. if err := verifyResultWithDelay(func() (bool, error) {
  1112. ns, _ := channelz.GetServerSockets(svrID, 0, 0)
  1113. sktData := ns[0].SocketData
  1114. if sktData.StreamsStarted != 2 || sktData.StreamsSucceeded != 2 || sktData.StreamsFailed != 0 || sktData.MessagesSent != 1 || sktData.MessagesReceived != 1 {
  1115. return false, fmt.Errorf("server socket metric with ID %d, want (StreamsStarted, StreamsSucceeded, StreamsFailed, MessagesSent, MessagesReceived) = (2, 2, 0, 1, 1), got (%d, %d, %d, %d, %d)", ns[0].ID, sktData.StreamsStarted, sktData.StreamsSucceeded, sktData.StreamsFailed, sktData.MessagesSent, sktData.MessagesReceived)
  1116. }
  1117. return true, nil
  1118. }); err != nil {
  1119. t.Fatal(err)
  1120. }
  1121. doClientSideInitiatedFailedStream(tc, t)
  1122. if err := verifyResultWithDelay(func() (bool, error) {
  1123. ns, _ := channelz.GetServerSockets(svrID, 0, 0)
  1124. sktData := ns[0].SocketData
  1125. if sktData.StreamsStarted != 3 || sktData.StreamsSucceeded != 2 || sktData.StreamsFailed != 1 || sktData.MessagesSent != 2 || sktData.MessagesReceived != 2 {
  1126. return false, fmt.Errorf("server socket metric with ID %d, want (StreamsStarted, StreamsSucceeded, StreamsFailed, MessagesSent, MessagesReceived) = (3, 2, 1, 2, 2), got (%d, %d, %d, %d, %d)", ns[0].ID, sktData.StreamsStarted, sktData.StreamsSucceeded, sktData.StreamsFailed, sktData.MessagesSent, sktData.MessagesReceived)
  1127. }
  1128. return true, nil
  1129. }); err != nil {
  1130. t.Fatal(err)
  1131. }
  1132. }
  1133. func (s) TestCZServerSocketMetricsKeepAlive(t *testing.T) {
  1134. channelz.NewChannelzStorage()
  1135. e := tcpClearRREnv
  1136. te := newTest(t, e)
  1137. te.customServerOptions = append(te.customServerOptions, grpc.KeepaliveParams(keepalive.ServerParameters{Time: time.Second, Timeout: 500 * time.Millisecond}))
  1138. te.startServer(&testServer{security: e.security})
  1139. defer te.tearDown()
  1140. cc := te.clientConn()
  1141. tc := testpb.NewTestServiceClient(cc)
  1142. doIdleCallToInvokeKeepAlive(tc, t)
  1143. if err := verifyResultWithDelay(func() (bool, error) {
  1144. ss, _ := channelz.GetServers(0, 0)
  1145. if len(ss) != 1 {
  1146. return false, fmt.Errorf("there should be one server, not %d", len(ss))
  1147. }
  1148. ns, _ := channelz.GetServerSockets(ss[0].ID, 0, 0)
  1149. if len(ns) != 1 {
  1150. return false, fmt.Errorf("there should be one server normal socket, not %d", len(ns))
  1151. }
  1152. if ns[0].SocketData.KeepAlivesSent != 2 { // doIdleCallToInvokeKeepAlive func is set up to send 2 KeepAlives.
  1153. return false, fmt.Errorf("there should be 2 KeepAlives sent, not %d", ns[0].SocketData.KeepAlivesSent)
  1154. }
  1155. return true, nil
  1156. }); err != nil {
  1157. t.Fatal(err)
  1158. }
  1159. }
  1160. var cipherSuites = []string{
  1161. "TLS_RSA_WITH_RC4_128_SHA",
  1162. "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
  1163. "TLS_RSA_WITH_AES_128_CBC_SHA",
  1164. "TLS_RSA_WITH_AES_256_CBC_SHA",
  1165. "TLS_RSA_WITH_AES_128_GCM_SHA256",
  1166. "TLS_RSA_WITH_AES_256_GCM_SHA384",
  1167. "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
  1168. "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
  1169. "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
  1170. "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
  1171. "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
  1172. "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
  1173. "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
  1174. "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
  1175. "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
  1176. "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
  1177. "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
  1178. "TLS_FALLBACK_SCSV",
  1179. "TLS_RSA_WITH_AES_128_CBC_SHA256",
  1180. "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
  1181. "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
  1182. "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305",
  1183. "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305",
  1184. "TLS_AES_128_GCM_SHA256",
  1185. "TLS_AES_256_GCM_SHA384",
  1186. "TLS_CHACHA20_POLY1305_SHA256",
  1187. }
  1188. func (s) TestCZSocketGetSecurityValueTLS(t *testing.T) {
  1189. channelz.NewChannelzStorage()
  1190. e := tcpTLSRREnv
  1191. te := newTest(t, e)
  1192. te.startServer(&testServer{security: e.security})
  1193. defer te.tearDown()
  1194. te.clientConn()
  1195. if err := verifyResultWithDelay(func() (bool, error) {
  1196. tchan, _ := channelz.GetTopChannels(0, 0)
  1197. if len(tchan) != 1 {
  1198. return false, fmt.Errorf("there should only be one top channel, not %d", len(tchan))
  1199. }
  1200. if len(tchan[0].SubChans) != 1 {
  1201. return false, fmt.Errorf("there should only be one subchannel under top channel %d, not %d", tchan[0].ID, len(tchan[0].SubChans))
  1202. }
  1203. var id int64
  1204. for id = range tchan[0].SubChans {
  1205. break
  1206. }
  1207. sc := channelz.GetSubChannel(id)
  1208. if sc == nil {
  1209. return false, fmt.Errorf("there should only be one socket under subchannel %d, not 0", id)
  1210. }
  1211. if len(sc.Sockets) != 1 {
  1212. return false, fmt.Errorf("there should only be one socket under subchannel %d, not %d", sc.ID, len(sc.Sockets))
  1213. }
  1214. for id = range sc.Sockets {
  1215. break
  1216. }
  1217. skt := channelz.GetSocket(id)
  1218. cert, _ := tls.LoadX509KeyPair(testdata.Path("server1.pem"), testdata.Path("server1.key"))
  1219. securityVal, ok := skt.SocketData.Security.(*credentials.TLSChannelzSecurityValue)
  1220. if !ok {
  1221. return false, fmt.Errorf("the SocketData.Security is of type: %T, want: *credentials.TLSChannelzSecurityValue", skt.SocketData.Security)
  1222. }
  1223. if !reflect.DeepEqual(securityVal.RemoteCertificate, cert.Certificate[0]) {
  1224. return false, fmt.Errorf("SocketData.Security.RemoteCertificate got: %v, want: %v", securityVal.RemoteCertificate, cert.Certificate[0])
  1225. }
  1226. for _, v := range cipherSuites {
  1227. if v == securityVal.StandardName {
  1228. return true, nil
  1229. }
  1230. }
  1231. return false, fmt.Errorf("SocketData.Security.StandardName got: %v, want it to be one of %v", securityVal.StandardName, cipherSuites)
  1232. }); err != nil {
  1233. t.Fatal(err)
  1234. }
  1235. }
  1236. func (s) TestCZChannelTraceCreationDeletion(t *testing.T) {
  1237. channelz.NewChannelzStorage()
  1238. e := tcpClearRREnv
  1239. // avoid calling API to set balancer type, which will void service config's change of balancer.
  1240. e.balancer = ""
  1241. te := newTest(t, e)
  1242. r, cleanup := manual.GenerateAndRegisterManualResolver()
  1243. defer cleanup()
  1244. resolvedAddrs := []resolver.Address{{Addr: "127.0.0.1:0", Type: resolver.GRPCLB, ServerName: "grpclb.server"}}
  1245. r.InitialAddrs(resolvedAddrs)
  1246. te.resolverScheme = r.Scheme()
  1247. te.clientConn()
  1248. defer te.tearDown()
  1249. var nestedConn int64
  1250. if err := verifyResultWithDelay(func() (bool, error) {
  1251. tcs, _ := channelz.GetTopChannels(0, 0)
  1252. if len(tcs) != 1 {
  1253. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  1254. }
  1255. if len(tcs[0].NestedChans) != 1 {
  1256. return false, fmt.Errorf("there should be one nested channel from grpclb, not %d", len(tcs[0].NestedChans))
  1257. }
  1258. for k := range tcs[0].NestedChans {
  1259. nestedConn = k
  1260. }
  1261. for _, e := range tcs[0].Trace.Events {
  1262. if e.RefID == nestedConn && e.RefType != channelz.RefChannel {
  1263. return false, fmt.Errorf("nested channel trace event shoud have RefChannel as RefType")
  1264. }
  1265. }
  1266. ncm := channelz.GetChannel(nestedConn)
  1267. if ncm.Trace == nil {
  1268. return false, fmt.Errorf("trace for nested channel should not be empty")
  1269. }
  1270. if len(ncm.Trace.Events) == 0 {
  1271. return false, fmt.Errorf("there should be at least one trace event for nested channel not 0")
  1272. }
  1273. if ncm.Trace.Events[0].Desc != "Channel Created" {
  1274. return false, fmt.Errorf("the first trace event should be \"Channel Created\", not %q", ncm.Trace.Events[0].Desc)
  1275. }
  1276. return true, nil
  1277. }); err != nil {
  1278. t.Fatal(err)
  1279. }
  1280. r.NewServiceConfig(`{"loadBalancingPolicy": "round_robin"}`)
  1281. r.NewAddress([]resolver.Address{{Addr: "127.0.0.1:0"}})
  1282. // wait for the shutdown of grpclb balancer
  1283. if err := verifyResultWithDelay(func() (bool, error) {
  1284. tcs, _ := channelz.GetTopChannels(0, 0)
  1285. if len(tcs) != 1 {
  1286. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  1287. }
  1288. if len(tcs[0].NestedChans) != 0 {
  1289. return false, fmt.Errorf("there should be 0 nested channel from grpclb, not %d", len(tcs[0].NestedChans))
  1290. }
  1291. ncm := channelz.GetChannel(nestedConn)
  1292. if ncm == nil {
  1293. return false, fmt.Errorf("nested channel should still exist due to parent's trace reference")
  1294. }
  1295. if ncm.Trace == nil {
  1296. return false, fmt.Errorf("trace for nested channel should not be empty")
  1297. }
  1298. if len(ncm.Trace.Events) == 0 {
  1299. return false, fmt.Errorf("there should be at least one trace event for nested channel not 0")
  1300. }
  1301. if ncm.Trace.Events[len(ncm.Trace.Events)-1].Desc != "Channel Deleted" {
  1302. return false, fmt.Errorf("the first trace event should be \"Channel Deleted\", not %q", ncm.Trace.Events[0].Desc)
  1303. }
  1304. return true, nil
  1305. }); err != nil {
  1306. t.Fatal(err)
  1307. }
  1308. }
  1309. func (s) TestCZSubChannelTraceCreationDeletion(t *testing.T) {
  1310. channelz.NewChannelzStorage()
  1311. e := tcpClearRREnv
  1312. te := newTest(t, e)
  1313. te.startServer(&testServer{security: e.security})
  1314. r, cleanup := manual.GenerateAndRegisterManualResolver()
  1315. defer cleanup()
  1316. r.InitialAddrs([]resolver.Address{{Addr: te.srvAddr}})
  1317. te.resolverScheme = r.Scheme()
  1318. te.clientConn()
  1319. defer te.tearDown()
  1320. var subConn int64
  1321. // Here, we just wait for all sockets to be up. In the future, if we implement
  1322. // IDLE, we may need to make several rpc calls to create the sockets.
  1323. if err := verifyResultWithDelay(func() (bool, error) {
  1324. tcs, _ := channelz.GetTopChannels(0, 0)
  1325. if len(tcs) != 1 {
  1326. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  1327. }
  1328. if len(tcs[0].SubChans) != 1 {
  1329. return false, fmt.Errorf("there should be 1 subchannel not %d", len(tcs[0].SubChans))
  1330. }
  1331. for k := range tcs[0].SubChans {
  1332. subConn = k
  1333. }
  1334. for _, e := range tcs[0].Trace.Events {
  1335. if e.RefID == subConn && e.RefType != channelz.RefSubChannel {
  1336. return false, fmt.Errorf("subchannel trace event shoud have RefType to be RefSubChannel")
  1337. }
  1338. }
  1339. scm := channelz.GetSubChannel(subConn)
  1340. if scm == nil {
  1341. return false, fmt.Errorf("subChannel does not exist")
  1342. }
  1343. if scm.Trace == nil {
  1344. return false, fmt.Errorf("trace for subChannel should not be empty")
  1345. }
  1346. if len(scm.Trace.Events) == 0 {
  1347. return false, fmt.Errorf("there should be at least one trace event for subChannel not 0")
  1348. }
  1349. if scm.Trace.Events[0].Desc != "Subchannel Created" {
  1350. return false, fmt.Errorf("the first trace event should be \"Subchannel Created\", not %q", scm.Trace.Events[0].Desc)
  1351. }
  1352. return true, nil
  1353. }); err != nil {
  1354. t.Fatal(err)
  1355. }
  1356. r.NewAddress([]resolver.Address{})
  1357. if err := verifyResultWithDelay(func() (bool, error) {
  1358. tcs, _ := channelz.GetTopChannels(0, 0)
  1359. if len(tcs) != 1 {
  1360. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  1361. }
  1362. if len(tcs[0].SubChans) != 0 {
  1363. return false, fmt.Errorf("there should be 0 subchannel not %d", len(tcs[0].SubChans))
  1364. }
  1365. scm := channelz.GetSubChannel(subConn)
  1366. if scm == nil {
  1367. return false, fmt.Errorf("subChannel should still exist due to parent's trace reference")
  1368. }
  1369. if scm.Trace == nil {
  1370. return false, fmt.Errorf("trace for SubChannel should not be empty")
  1371. }
  1372. if len(scm.Trace.Events) == 0 {
  1373. return false, fmt.Errorf("there should be at least one trace event for subChannel not 0")
  1374. }
  1375. if got, want := scm.Trace.Events[len(scm.Trace.Events)-1].Desc, "Subchannel Deleted"; got != want {
  1376. return false, fmt.Errorf("the last trace event should be %q, not %q", want, got)
  1377. }
  1378. return true, nil
  1379. }); err != nil {
  1380. t.Fatal(err)
  1381. }
  1382. }
  1383. func (s) TestCZChannelAddressResolutionChange(t *testing.T) {
  1384. channelz.NewChannelzStorage()
  1385. e := tcpClearRREnv
  1386. e.balancer = ""
  1387. te := newTest(t, e)
  1388. te.startServer(&testServer{security: e.security})
  1389. r, cleanup := manual.GenerateAndRegisterManualResolver()
  1390. defer cleanup()
  1391. r.InitialAddrs([]resolver.Address{{Addr: te.srvAddr}})
  1392. te.resolverScheme = r.Scheme()
  1393. te.clientConn()
  1394. defer te.tearDown()
  1395. var cid int64
  1396. // Here, we just wait for all sockets to be up. In the future, if we implement
  1397. // IDLE, we may need to make several rpc calls to create the sockets.
  1398. if err := verifyResultWithDelay(func() (bool, error) {
  1399. tcs, _ := channelz.GetTopChannels(0, 0)
  1400. if len(tcs) != 1 {
  1401. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  1402. }
  1403. cid = tcs[0].ID
  1404. for i := len(tcs[0].Trace.Events) - 1; i >= 0; i-- {
  1405. if tcs[0].Trace.Events[i].Desc == fmt.Sprintf("Resolver returns a non-empty address list (previous one was empty) %q", te.srvAddr) {
  1406. break
  1407. }
  1408. if i == 0 {
  1409. return false, fmt.Errorf("events do not contain expected address resolution from empty address state")
  1410. }
  1411. }
  1412. return true, nil
  1413. }); err != nil {
  1414. t.Fatal(err)
  1415. }
  1416. r.NewServiceConfig(`{"loadBalancingPolicy": "round_robin"}`)
  1417. if err := verifyResultWithDelay(func() (bool, error) {
  1418. cm := channelz.GetChannel(cid)
  1419. for i := len(cm.Trace.Events) - 1; i >= 0; i-- {
  1420. if cm.Trace.Events[i].Desc == fmt.Sprintf("Channel switches to new LB policy %q", roundrobin.Name) {
  1421. break
  1422. }
  1423. if i == 0 {
  1424. return false, fmt.Errorf("events do not contain expected address resolution change of LB policy")
  1425. }
  1426. }
  1427. return true, nil
  1428. }); err != nil {
  1429. t.Fatal(err)
  1430. }
  1431. newSc := `{
  1432. "methodConfig": [
  1433. {
  1434. "name": [
  1435. {
  1436. "service": "grpc.testing.TestService",
  1437. "method": "EmptyCall"
  1438. },
  1439. ],
  1440. "waitForReady": false,
  1441. "timeout": ".001s"
  1442. }
  1443. ]
  1444. }`
  1445. r.NewServiceConfig(newSc)
  1446. if err := verifyResultWithDelay(func() (bool, error) {
  1447. cm := channelz.GetChannel(cid)
  1448. for i := len(cm.Trace.Events) - 1; i >= 0; i-- {
  1449. if cm.Trace.Events[i].Desc == fmt.Sprintf("Channel has a new service config \"%s\"", newSc) {
  1450. break
  1451. }
  1452. if i == 0 {
  1453. return false, fmt.Errorf("events do not contain expected address resolution of new service config")
  1454. }
  1455. }
  1456. return true, nil
  1457. }); err != nil {
  1458. t.Fatal(err)
  1459. }
  1460. r.NewAddress([]resolver.Address{})
  1461. if err := verifyResultWithDelay(func() (bool, error) {
  1462. cm := channelz.GetChannel(cid)
  1463. for i := len(cm.Trace.Events) - 1; i >= 0; i-- {
  1464. if cm.Trace.Events[i].Desc == "Resolver returns an empty address list" {
  1465. break
  1466. }
  1467. if i == 0 {
  1468. return false, fmt.Errorf("events do not contain expected address resolution of empty address")
  1469. }
  1470. }
  1471. return true, nil
  1472. }); err != nil {
  1473. t.Fatal(err)
  1474. }
  1475. }
  1476. func (s) TestCZSubChannelPickedNewAddress(t *testing.T) {
  1477. channelz.NewChannelzStorage()
  1478. e := tcpClearRREnv
  1479. e.balancer = ""
  1480. te := newTest(t, e)
  1481. te.startServers(&testServer{security: e.security}, 3)
  1482. r, cleanup := manual.GenerateAndRegisterManualResolver()
  1483. defer cleanup()
  1484. var svrAddrs []resolver.Address
  1485. for _, a := range te.srvAddrs {
  1486. svrAddrs = append(svrAddrs, resolver.Address{Addr: a})
  1487. }
  1488. r.InitialAddrs(svrAddrs)
  1489. te.resolverScheme = r.Scheme()
  1490. cc := te.clientConn()
  1491. defer te.tearDown()
  1492. tc := testpb.NewTestServiceClient(cc)
  1493. // make sure the connection is up
  1494. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  1495. defer cancel()
  1496. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}); err != nil {
  1497. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err)
  1498. }
  1499. te.srvs[0].Stop()
  1500. te.srvs[1].Stop()
  1501. // Here, we just wait for all sockets to be up. In the future, if we implement
  1502. // IDLE, we may need to make several rpc calls to create the sockets.
  1503. if err := verifyResultWithDelay(func() (bool, error) {
  1504. tcs, _ := channelz.GetTopChannels(0, 0)
  1505. if len(tcs) != 1 {
  1506. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  1507. }
  1508. if len(tcs[0].SubChans) != 1 {
  1509. return false, fmt.Errorf("there should be 1 subchannel not %d", len(tcs[0].SubChans))
  1510. }
  1511. var subConn int64
  1512. for k := range tcs[0].SubChans {
  1513. subConn = k
  1514. }
  1515. scm := channelz.GetSubChannel(subConn)
  1516. if scm.Trace == nil {
  1517. return false, fmt.Errorf("trace for SubChannel should not be empty")
  1518. }
  1519. if len(scm.Trace.Events) == 0 {
  1520. return false, fmt.Errorf("there should be at least one trace event for subChannel not 0")
  1521. }
  1522. for i := len(scm.Trace.Events) - 1; i >= 0; i-- {
  1523. if scm.Trace.Events[i].Desc == fmt.Sprintf("Subchannel picks a new address %q to connect", te.srvAddrs[2]) {
  1524. break
  1525. }
  1526. if i == 0 {
  1527. return false, fmt.Errorf("events do not contain expected address resolution of subchannel picked new address")
  1528. }
  1529. }
  1530. return true, nil
  1531. }); err != nil {
  1532. t.Fatal(err)
  1533. }
  1534. }
  1535. func (s) TestCZSubChannelConnectivityState(t *testing.T) {
  1536. channelz.NewChannelzStorage()
  1537. e := tcpClearRREnv
  1538. te := newTest(t, e)
  1539. te.startServer(&testServer{security: e.security})
  1540. r, cleanup := manual.GenerateAndRegisterManualResolver()
  1541. defer cleanup()
  1542. r.InitialAddrs([]resolver.Address{{Addr: te.srvAddr}})
  1543. te.resolverScheme = r.Scheme()
  1544. cc := te.clientConn()
  1545. defer te.tearDown()
  1546. tc := testpb.NewTestServiceClient(cc)
  1547. // make sure the connection is up
  1548. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  1549. defer cancel()
  1550. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}); err != nil {
  1551. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err)
  1552. }
  1553. var subConn int64
  1554. te.srv.Stop()
  1555. if err := verifyResultWithDelay(func() (bool, error) {
  1556. // we need to obtain the SubChannel id before it gets deleted from Channel's children list (due
  1557. // to effect of r.NewAddress([]resolver.Address{}))
  1558. if subConn == 0 {
  1559. tcs, _ := channelz.GetTopChannels(0, 0)
  1560. if len(tcs) != 1 {
  1561. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  1562. }
  1563. if len(tcs[0].SubChans) != 1 {
  1564. return false, fmt.Errorf("there should be 1 subchannel not %d", len(tcs[0].SubChans))
  1565. }
  1566. for k := range tcs[0].SubChans {
  1567. // get the SubChannel id for further trace inquiry.
  1568. subConn = k
  1569. }
  1570. }
  1571. scm := channelz.GetSubChannel(subConn)
  1572. if scm == nil {
  1573. return false, fmt.Errorf("subChannel should still exist due to parent's trace reference")
  1574. }
  1575. if scm.Trace == nil {
  1576. return false, fmt.Errorf("trace for SubChannel should not be empty")
  1577. }
  1578. if len(scm.Trace.Events) == 0 {
  1579. return false, fmt.Errorf("there should be at least one trace event for subChannel not 0")
  1580. }
  1581. var ready, connecting, transient, shutdown int
  1582. for _, e := range scm.Trace.Events {
  1583. if e.Desc == fmt.Sprintf("Subchannel Connectivity change to %v", connectivity.TransientFailure) {
  1584. transient++
  1585. }
  1586. }
  1587. // Make sure the SubChannel has already seen transient failure before shutting it down through
  1588. // r.NewAddress([]resolver.Address{}).
  1589. if transient == 0 {
  1590. return false, fmt.Errorf("transient failure has not happened on SubChannel yet")
  1591. }
  1592. transient = 0
  1593. r.NewAddress([]resolver.Address{})
  1594. for _, e := range scm.Trace.Events {
  1595. if e.Desc == fmt.Sprintf("Subchannel Connectivity change to %v", connectivity.Ready) {
  1596. ready++
  1597. }
  1598. if e.Desc == fmt.Sprintf("Subchannel Connectivity change to %v", connectivity.Connecting) {
  1599. connecting++
  1600. }
  1601. if e.Desc == fmt.Sprintf("Subchannel Connectivity change to %v", connectivity.TransientFailure) {
  1602. transient++
  1603. }
  1604. if e.Desc == fmt.Sprintf("Subchannel Connectivity change to %v", connectivity.Shutdown) {
  1605. shutdown++
  1606. }
  1607. }
  1608. // example:
  1609. // Subchannel Created
  1610. // Subchannel's connectivity state changed to CONNECTING
  1611. // Subchannel picked a new address: "localhost:36011"
  1612. // Subchannel's connectivity state changed to READY
  1613. // Subchannel's connectivity state changed to TRANSIENT_FAILURE
  1614. // Subchannel's connectivity state changed to CONNECTING
  1615. // Subchannel picked a new address: "localhost:36011"
  1616. // Subchannel's connectivity state changed to SHUTDOWN
  1617. // Subchannel Deleted
  1618. if ready != 1 || connecting < 1 || transient < 1 || shutdown != 1 {
  1619. return false, fmt.Errorf("got: ready = %d, connecting = %d, transient = %d, shutdown = %d, want: 1, >=1, >=1, 1", ready, connecting, transient, shutdown)
  1620. }
  1621. return true, nil
  1622. }); err != nil {
  1623. t.Fatal(err)
  1624. }
  1625. }
  1626. func (s) TestCZChannelConnectivityState(t *testing.T) {
  1627. channelz.NewChannelzStorage()
  1628. e := tcpClearRREnv
  1629. te := newTest(t, e)
  1630. te.startServer(&testServer{security: e.security})
  1631. r, cleanup := manual.GenerateAndRegisterManualResolver()
  1632. defer cleanup()
  1633. r.InitialAddrs([]resolver.Address{{Addr: te.srvAddr}})
  1634. te.resolverScheme = r.Scheme()
  1635. cc := te.clientConn()
  1636. defer te.tearDown()
  1637. tc := testpb.NewTestServiceClient(cc)
  1638. // make sure the connection is up
  1639. ctx, cancel := context.WithTimeout(context.Background(), time.Second)
  1640. defer cancel()
  1641. if _, err := tc.EmptyCall(ctx, &testpb.Empty{}); err != nil {
  1642. t.Fatalf("TestService/EmptyCall(_, _) = _, %v, want _, <nil>", err)
  1643. }
  1644. te.srv.Stop()
  1645. if err := verifyResultWithDelay(func() (bool, error) {
  1646. tcs, _ := channelz.GetTopChannels(0, 0)
  1647. if len(tcs) != 1 {
  1648. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  1649. }
  1650. var ready, connecting, transient int
  1651. for _, e := range tcs[0].Trace.Events {
  1652. if e.Desc == fmt.Sprintf("Channel Connectivity change to %v", connectivity.Ready) {
  1653. ready++
  1654. }
  1655. if e.Desc == fmt.Sprintf("Channel Connectivity change to %v", connectivity.Connecting) {
  1656. connecting++
  1657. }
  1658. if e.Desc == fmt.Sprintf("Channel Connectivity change to %v", connectivity.TransientFailure) {
  1659. transient++
  1660. }
  1661. }
  1662. // example:
  1663. // Channel Created
  1664. // Adressses resolved (from empty address state): "localhost:40467"
  1665. // SubChannel (id: 4[]) Created
  1666. // Channel's connectivity state changed to CONNECTING
  1667. // Channel's connectivity state changed to READY
  1668. // Channel's connectivity state changed to TRANSIENT_FAILURE
  1669. // Channel's connectivity state changed to CONNECTING
  1670. // Channel's connectivity state changed to TRANSIENT_FAILURE
  1671. if ready != 1 || connecting < 1 || transient < 1 {
  1672. return false, fmt.Errorf("got: ready = %d, connecting = %d, transient = %d, want: 1, >=1, >=1", ready, connecting, transient)
  1673. }
  1674. return true, nil
  1675. }); err != nil {
  1676. t.Fatal(err)
  1677. }
  1678. }
  1679. func (s) TestCZTraceOverwriteChannelDeletion(t *testing.T) {
  1680. channelz.NewChannelzStorage()
  1681. e := tcpClearRREnv
  1682. // avoid calling API to set balancer type, which will void service config's change of balancer.
  1683. e.balancer = ""
  1684. te := newTest(t, e)
  1685. channelz.SetMaxTraceEntry(1)
  1686. defer channelz.ResetMaxTraceEntryToDefault()
  1687. r, cleanup := manual.GenerateAndRegisterManualResolver()
  1688. defer cleanup()
  1689. resolvedAddrs := []resolver.Address{{Addr: "127.0.0.1:0", Type: resolver.GRPCLB, ServerName: "grpclb.server"}}
  1690. r.InitialAddrs(resolvedAddrs)
  1691. te.resolverScheme = r.Scheme()
  1692. te.clientConn()
  1693. defer te.tearDown()
  1694. var nestedConn int64
  1695. if err := verifyResultWithDelay(func() (bool, error) {
  1696. tcs, _ := channelz.GetTopChannels(0, 0)
  1697. if len(tcs) != 1 {
  1698. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  1699. }
  1700. if len(tcs[0].NestedChans) != 1 {
  1701. return false, fmt.Errorf("there should be one nested channel from grpclb, not %d", len(tcs[0].NestedChans))
  1702. }
  1703. for k := range tcs[0].NestedChans {
  1704. nestedConn = k
  1705. }
  1706. return true, nil
  1707. }); err != nil {
  1708. t.Fatal(err)
  1709. }
  1710. r.NewServiceConfig(`{"loadBalancingPolicy": "round_robin"}`)
  1711. r.NewAddress([]resolver.Address{{Addr: "127.0.0.1:0"}})
  1712. // wait for the shutdown of grpclb balancer
  1713. if err := verifyResultWithDelay(func() (bool, error) {
  1714. tcs, _ := channelz.GetTopChannels(0, 0)
  1715. if len(tcs) != 1 {
  1716. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  1717. }
  1718. if len(tcs[0].NestedChans) != 0 {
  1719. return false, fmt.Errorf("there should be 0 nested channel from grpclb, not %d", len(tcs[0].NestedChans))
  1720. }
  1721. return true, nil
  1722. }); err != nil {
  1723. t.Fatal(err)
  1724. }
  1725. // verify that the nested channel no longer exist due to trace referencing it got overwritten.
  1726. if err := verifyResultWithDelay(func() (bool, error) {
  1727. cm := channelz.GetChannel(nestedConn)
  1728. if cm != nil {
  1729. return false, fmt.Errorf("nested channel should have been deleted since its parent's trace should not contain any reference to it anymore")
  1730. }
  1731. return true, nil
  1732. }); err != nil {
  1733. t.Fatal(err)
  1734. }
  1735. }
  1736. func (s) TestCZTraceOverwriteSubChannelDeletion(t *testing.T) {
  1737. channelz.NewChannelzStorage()
  1738. e := tcpClearRREnv
  1739. te := newTest(t, e)
  1740. channelz.SetMaxTraceEntry(1)
  1741. defer channelz.ResetMaxTraceEntryToDefault()
  1742. te.startServer(&testServer{security: e.security})
  1743. r, cleanup := manual.GenerateAndRegisterManualResolver()
  1744. defer cleanup()
  1745. r.InitialAddrs([]resolver.Address{{Addr: te.srvAddr}})
  1746. te.resolverScheme = r.Scheme()
  1747. te.clientConn()
  1748. defer te.tearDown()
  1749. var subConn int64
  1750. // Here, we just wait for all sockets to be up. In the future, if we implement
  1751. // IDLE, we may need to make several rpc calls to create the sockets.
  1752. if err := verifyResultWithDelay(func() (bool, error) {
  1753. tcs, _ := channelz.GetTopChannels(0, 0)
  1754. if len(tcs) != 1 {
  1755. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  1756. }
  1757. if len(tcs[0].SubChans) != 1 {
  1758. return false, fmt.Errorf("there should be 1 subchannel not %d", len(tcs[0].SubChans))
  1759. }
  1760. for k := range tcs[0].SubChans {
  1761. subConn = k
  1762. }
  1763. return true, nil
  1764. }); err != nil {
  1765. t.Fatal(err)
  1766. }
  1767. r.NewAddress([]resolver.Address{})
  1768. if err := verifyResultWithDelay(func() (bool, error) {
  1769. tcs, _ := channelz.GetTopChannels(0, 0)
  1770. if len(tcs) != 1 {
  1771. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  1772. }
  1773. if len(tcs[0].SubChans) != 0 {
  1774. return false, fmt.Errorf("there should be 0 subchannel not %d", len(tcs[0].SubChans))
  1775. }
  1776. return true, nil
  1777. }); err != nil {
  1778. t.Fatal(err)
  1779. }
  1780. // verify that the subchannel no longer exist due to trace referencing it got overwritten.
  1781. if err := verifyResultWithDelay(func() (bool, error) {
  1782. cm := channelz.GetChannel(subConn)
  1783. if cm != nil {
  1784. return false, fmt.Errorf("subchannel should have been deleted since its parent's trace should not contain any reference to it anymore")
  1785. }
  1786. return true, nil
  1787. }); err != nil {
  1788. t.Fatal(err)
  1789. }
  1790. }
  1791. func (s) TestCZTraceTopChannelDeletionTraceClear(t *testing.T) {
  1792. channelz.NewChannelzStorage()
  1793. e := tcpClearRREnv
  1794. te := newTest(t, e)
  1795. te.startServer(&testServer{security: e.security})
  1796. r, cleanup := manual.GenerateAndRegisterManualResolver()
  1797. defer cleanup()
  1798. r.InitialAddrs([]resolver.Address{{Addr: te.srvAddr}})
  1799. te.resolverScheme = r.Scheme()
  1800. te.clientConn()
  1801. var subConn int64
  1802. // Here, we just wait for all sockets to be up. In the future, if we implement
  1803. // IDLE, we may need to make several rpc calls to create the sockets.
  1804. if err := verifyResultWithDelay(func() (bool, error) {
  1805. tcs, _ := channelz.GetTopChannels(0, 0)
  1806. if len(tcs) != 1 {
  1807. return false, fmt.Errorf("there should only be one top channel, not %d", len(tcs))
  1808. }
  1809. if len(tcs[0].SubChans) != 1 {
  1810. return false, fmt.Errorf("there should be 1 subchannel not %d", len(tcs[0].SubChans))
  1811. }
  1812. for k := range tcs[0].SubChans {
  1813. subConn = k
  1814. }
  1815. return true, nil
  1816. }); err != nil {
  1817. t.Fatal(err)
  1818. }
  1819. te.tearDown()
  1820. // verify that the subchannel no longer exist due to parent channel got deleted and its trace cleared.
  1821. if err := verifyResultWithDelay(func() (bool, error) {
  1822. cm := channelz.GetChannel(subConn)
  1823. if cm != nil {
  1824. return false, fmt.Errorf("subchannel should have been deleted since its parent's trace should not contain any reference to it anymore")
  1825. }
  1826. return true, nil
  1827. }); err != nil {
  1828. t.Fatal(err)
  1829. }
  1830. }