grpc 1.3.4 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of grpc might be problematic. Click here for more details.

Files changed (286) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +581 -450
  3. data/include/grpc/census.h +49 -49
  4. data/include/grpc/grpc.h +16 -70
  5. data/include/grpc/grpc_security.h +59 -59
  6. data/include/grpc/grpc_security_constants.h +9 -9
  7. data/include/grpc/impl/codegen/atm.h +1 -1
  8. data/include/grpc/impl/codegen/atm_windows.h +4 -4
  9. data/include/grpc/impl/codegen/byte_buffer_reader.h +2 -2
  10. data/include/grpc/impl/codegen/compression_types.h +4 -5
  11. data/include/grpc/impl/codegen/gpr_slice.h +5 -5
  12. data/include/grpc/impl/codegen/gpr_types.h +6 -7
  13. data/include/grpc/impl/codegen/grpc_types.h +128 -59
  14. data/include/grpc/impl/codegen/port_platform.h +6 -0
  15. data/include/grpc/impl/codegen/propagation_bits.h +2 -2
  16. data/include/grpc/impl/codegen/slice.h +13 -12
  17. data/include/grpc/impl/codegen/status.h +23 -18
  18. data/include/grpc/impl/codegen/sync.h +1 -1
  19. data/include/grpc/load_reporting.h +6 -6
  20. data/include/grpc/slice.h +47 -25
  21. data/include/grpc/slice_buffer.h +18 -14
  22. data/include/grpc/support/alloc.h +7 -7
  23. data/include/grpc/support/cmdline.h +10 -10
  24. data/include/grpc/support/cpu.h +3 -3
  25. data/include/grpc/support/histogram.h +1 -1
  26. data/include/grpc/support/host_port.h +2 -2
  27. data/include/grpc/support/log.h +9 -9
  28. data/include/grpc/support/log_windows.h +1 -1
  29. data/include/grpc/support/string_util.h +3 -3
  30. data/include/grpc/support/subprocess.h +3 -3
  31. data/include/grpc/support/sync.h +31 -31
  32. data/include/grpc/support/thd.h +11 -11
  33. data/include/grpc/support/time.h +12 -12
  34. data/include/grpc/support/tls.h +1 -1
  35. data/include/grpc/support/tls_gcc.h +2 -2
  36. data/include/grpc/support/tls_msvc.h +1 -1
  37. data/include/grpc/support/tls_pthread.h +1 -1
  38. data/include/grpc/support/useful.h +2 -2
  39. data/include/grpc/support/workaround_list.h +46 -0
  40. data/src/core/ext/census/context.c +1 -1
  41. data/src/core/ext/census/intrusive_hash_map.c +319 -0
  42. data/src/core/ext/census/intrusive_hash_map.h +167 -0
  43. data/src/core/ext/census/intrusive_hash_map_internal.h +63 -0
  44. data/src/core/ext/census/resource.c +3 -1
  45. data/src/core/ext/filters/client_channel/channel_connectivity.c +1 -1
  46. data/src/core/ext/filters/client_channel/client_channel.c +173 -103
  47. data/src/core/ext/filters/client_channel/client_channel_plugin.c +3 -2
  48. data/src/core/ext/filters/client_channel/lb_policy.c +2 -1
  49. data/src/core/ext/filters/client_channel/lb_policy.h +8 -7
  50. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c +153 -0
  51. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +42 -0
  52. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c +405 -102
  53. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c +133 -0
  54. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +65 -0
  55. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c +90 -51
  56. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +7 -1
  57. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +19 -8
  58. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +63 -34
  59. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c +2 -1
  60. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c +188 -294
  61. data/src/core/ext/filters/client_channel/lb_policy_factory.c +28 -5
  62. data/src/core/ext/filters/client_channel/lb_policy_factory.h +18 -4
  63. data/src/core/ext/filters/client_channel/parse_address.c +90 -59
  64. data/src/core/ext/filters/client_channel/parse_address.h +17 -8
  65. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.c +11 -7
  66. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.c +59 -14
  67. data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.h +6 -0
  68. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.c +3 -3
  69. data/src/core/ext/filters/client_channel/subchannel.c +20 -17
  70. data/src/core/ext/filters/client_channel/subchannel.h +1 -0
  71. data/src/core/ext/filters/client_channel/subchannel_index.c +11 -1
  72. data/src/core/ext/filters/client_channel/uri_parser.c +36 -22
  73. data/src/core/ext/filters/client_channel/uri_parser.h +1 -1
  74. data/src/core/{lib/channel → ext/filters/deadline}/deadline_filter.c +42 -17
  75. data/src/core/{lib/channel → ext/filters/deadline}/deadline_filter.h +8 -9
  76. data/src/core/{lib/channel → ext/filters/http/client}/http_client_filter.c +19 -11
  77. data/src/core/{lib/channel → ext/filters/http/client}/http_client_filter.h +3 -6
  78. data/src/core/ext/filters/http/http_filters_plugin.c +104 -0
  79. data/src/core/{lib/channel/compress_filter.c → ext/filters/http/message_compress/message_compress_filter.c} +124 -23
  80. data/src/core/{lib/channel/compress_filter.h → ext/filters/http/message_compress/message_compress_filter.h} +5 -6
  81. data/src/core/{lib/channel → ext/filters/http/server}/http_server_filter.c +4 -6
  82. data/src/core/{lib/channel → ext/filters/http/server}/http_server_filter.h +3 -3
  83. data/src/core/ext/filters/load_reporting/load_reporting.c +2 -25
  84. data/src/core/ext/filters/load_reporting/load_reporting_filter.c +26 -1
  85. data/src/core/ext/filters/max_age/max_age_filter.c +14 -14
  86. data/src/core/{lib/channel → ext/filters/message_size}/message_size_filter.c +91 -47
  87. data/src/core/{lib/channel → ext/filters/message_size}/message_size_filter.h +3 -3
  88. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.c +223 -0
  89. data/src/core/ext/filters/workarounds/workaround_cronet_compression_filter.h +40 -0
  90. data/src/core/ext/filters/workarounds/workaround_utils.c +65 -0
  91. data/src/core/ext/filters/workarounds/workaround_utils.h +52 -0
  92. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +1 -1
  93. data/src/core/ext/transport/chttp2/server/chttp2_server.c +3 -2
  94. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +2 -2
  95. data/src/core/ext/transport/chttp2/transport/bin_encoder.c +3 -3
  96. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +319 -175
  97. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -2
  98. data/src/core/ext/transport/chttp2/transport/frame_data.c +203 -164
  99. data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -14
  100. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +1 -1
  101. data/src/core/ext/transport/chttp2/transport/frame_ping.c +1 -1
  102. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +1 -1
  103. data/src/core/ext/transport/chttp2/transport/frame_settings.c +5 -5
  104. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +1 -1
  105. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +4 -4
  106. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +2 -4
  107. data/src/core/ext/transport/chttp2/transport/hpack_table.c +4 -3
  108. data/src/core/ext/transport/chttp2/transport/internal.h +50 -33
  109. data/src/core/ext/transport/chttp2/transport/parsing.c +10 -11
  110. data/src/core/ext/transport/chttp2/transport/writing.c +32 -13
  111. data/src/core/lib/channel/channel_args.c +30 -9
  112. data/src/core/lib/channel/channel_args.h +5 -1
  113. data/src/core/lib/channel/channel_stack.c +1 -1
  114. data/src/core/lib/channel/channel_stack.h +2 -2
  115. data/src/core/lib/channel/channel_stack_builder.c +13 -1
  116. data/src/core/lib/channel/channel_stack_builder.h +5 -1
  117. data/src/core/lib/channel/connected_channel.c +3 -1
  118. data/src/core/lib/channel/context.h +2 -2
  119. data/src/core/lib/compression/message_compress.c +2 -2
  120. data/src/core/lib/debug/trace.c +13 -6
  121. data/src/core/lib/debug/trace.h +27 -1
  122. data/src/core/lib/http/httpcli.c +1 -1
  123. data/src/core/lib/http/httpcli_security_connector.c +9 -11
  124. data/src/core/lib/http/parser.c +2 -2
  125. data/src/core/lib/http/parser.h +2 -1
  126. data/src/core/lib/iomgr/combiner.c +6 -6
  127. data/src/core/lib/iomgr/combiner.h +2 -1
  128. data/src/core/lib/iomgr/error.c +12 -5
  129. data/src/core/lib/iomgr/error.h +13 -13
  130. data/src/core/lib/iomgr/ev_epoll1_linux.c +984 -0
  131. data/src/core/lib/iomgr/ev_epoll1_linux.h +44 -0
  132. data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c +2146 -0
  133. data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.h +43 -0
  134. data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.c +1337 -0
  135. data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.h +43 -0
  136. data/src/core/lib/iomgr/ev_epollex_linux.c +1511 -0
  137. data/src/core/lib/iomgr/ev_epollex_linux.h +43 -0
  138. data/src/core/lib/iomgr/{ev_epoll_linux.c → ev_epollsig_linux.c} +41 -33
  139. data/src/core/lib/iomgr/{ev_epoll_linux.h → ev_epollsig_linux.h} +4 -4
  140. data/src/core/lib/iomgr/ev_poll_posix.c +12 -27
  141. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  142. data/src/core/lib/iomgr/ev_posix.c +22 -8
  143. data/src/core/lib/iomgr/ev_posix.h +4 -3
  144. data/src/core/lib/iomgr/ev_windows.c +43 -0
  145. data/src/core/lib/iomgr/exec_ctx.c +5 -0
  146. data/src/core/lib/iomgr/exec_ctx.h +2 -0
  147. data/src/core/lib/iomgr/iomgr.c +4 -0
  148. data/src/core/lib/iomgr/iomgr.h +3 -0
  149. data/src/core/lib/iomgr/is_epollexclusive_available.c +116 -0
  150. data/src/core/lib/iomgr/is_epollexclusive_available.h +41 -0
  151. data/src/core/lib/iomgr/lockfree_event.c +16 -0
  152. data/src/core/lib/iomgr/pollset.h +2 -5
  153. data/src/core/lib/iomgr/pollset_uv.c +1 -1
  154. data/src/core/lib/iomgr/pollset_windows.c +3 -3
  155. data/src/core/lib/iomgr/resource_quota.c +9 -8
  156. data/src/core/lib/iomgr/resource_quota.h +2 -1
  157. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  158. data/src/core/lib/iomgr/socket_mutator.h +2 -0
  159. data/src/core/lib/iomgr/sys_epoll_wrapper.h +43 -0
  160. data/src/core/lib/iomgr/tcp_client_posix.c +6 -6
  161. data/src/core/lib/iomgr/tcp_client_uv.c +3 -3
  162. data/src/core/lib/iomgr/tcp_posix.c +7 -7
  163. data/src/core/lib/iomgr/tcp_posix.h +2 -1
  164. data/src/core/lib/iomgr/tcp_server_posix.c +1 -1
  165. data/src/core/lib/iomgr/tcp_uv.c +6 -6
  166. data/src/core/lib/iomgr/tcp_uv.h +2 -1
  167. data/src/core/lib/iomgr/tcp_windows.c +1 -1
  168. data/src/core/lib/iomgr/timer_generic.c +24 -25
  169. data/src/core/lib/iomgr/timer_manager.c +276 -0
  170. data/src/core/lib/iomgr/timer_manager.h +52 -0
  171. data/src/core/lib/iomgr/timer_uv.c +6 -0
  172. data/src/core/lib/iomgr/udp_server.c +42 -9
  173. data/src/core/lib/iomgr/udp_server.h +3 -1
  174. data/src/core/lib/security/credentials/credentials.c +0 -1
  175. data/src/core/lib/security/credentials/fake/fake_credentials.c +23 -0
  176. data/src/core/lib/security/credentials/fake/fake_credentials.h +12 -9
  177. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +1 -1
  178. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +1 -1
  179. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +1 -1
  180. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +24 -53
  181. data/src/core/lib/security/transport/client_auth_filter.c +9 -3
  182. data/src/core/lib/security/transport/secure_endpoint.c +7 -7
  183. data/src/core/lib/security/transport/secure_endpoint.h +1 -1
  184. data/src/core/lib/security/transport/security_connector.c +45 -57
  185. data/src/core/lib/security/transport/security_connector.h +10 -14
  186. data/src/core/lib/security/transport/security_handshaker.c +123 -97
  187. data/src/core/lib/slice/b64.c +1 -1
  188. data/src/core/lib/slice/percent_encoding.c +3 -3
  189. data/src/core/lib/slice/slice.c +66 -33
  190. data/src/core/lib/slice/slice_buffer.c +25 -6
  191. data/src/core/lib/slice/slice_hash_table.c +33 -35
  192. data/src/core/lib/slice/slice_hash_table.h +7 -12
  193. data/src/core/lib/support/atomic.h +45 -0
  194. data/src/core/lib/support/atomic_with_atm.h +70 -0
  195. data/src/core/lib/support/atomic_with_std.h +48 -0
  196. data/src/core/lib/support/avl.c +14 -14
  197. data/src/core/lib/support/cmdline.c +3 -3
  198. data/src/core/lib/support/histogram.c +2 -2
  199. data/src/core/lib/support/host_port.c +1 -1
  200. data/src/core/lib/support/memory.h +74 -0
  201. data/src/core/lib/support/mpscq.c +36 -2
  202. data/src/core/lib/support/mpscq.h +28 -1
  203. data/src/core/lib/support/stack_lockfree.c +3 -36
  204. data/src/core/lib/support/string.c +12 -12
  205. data/src/core/lib/support/string_posix.c +1 -1
  206. data/src/core/lib/support/subprocess_posix.c +2 -2
  207. data/src/core/lib/support/thd_posix.c +1 -1
  208. data/src/core/lib/support/time_posix.c +8 -0
  209. data/src/core/lib/support/tmpfile_posix.c +10 -10
  210. data/src/core/lib/surface/alarm.c +3 -1
  211. data/src/core/lib/surface/api_trace.c +2 -1
  212. data/src/core/lib/surface/api_trace.h +2 -2
  213. data/src/core/lib/surface/byte_buffer_reader.c +1 -1
  214. data/src/core/lib/surface/call.c +65 -22
  215. data/src/core/lib/surface/call.h +4 -2
  216. data/src/core/lib/surface/channel_init.c +2 -19
  217. data/src/core/lib/surface/channel_stack_type.c +18 -0
  218. data/src/core/lib/surface/channel_stack_type.h +2 -0
  219. data/src/core/lib/surface/completion_queue.c +694 -247
  220. data/src/core/lib/surface/completion_queue.h +30 -13
  221. data/src/core/lib/surface/completion_queue_factory.c +24 -9
  222. data/src/core/lib/surface/init.c +1 -52
  223. data/src/core/lib/surface/{lame_client.c → lame_client.cc} +37 -26
  224. data/src/core/lib/surface/server.c +79 -110
  225. data/src/core/lib/surface/server.h +2 -1
  226. data/src/core/lib/surface/version.c +2 -2
  227. data/src/core/lib/transport/bdp_estimator.c +25 -9
  228. data/src/core/lib/transport/bdp_estimator.h +7 -1
  229. data/src/core/lib/transport/byte_stream.c +23 -9
  230. data/src/core/lib/transport/byte_stream.h +15 -6
  231. data/src/core/lib/transport/connectivity_state.c +6 -6
  232. data/src/core/lib/transport/connectivity_state.h +2 -1
  233. data/src/core/lib/transport/service_config.c +6 -13
  234. data/src/core/lib/transport/service_config.h +2 -2
  235. data/src/core/lib/transport/static_metadata.c +403 -389
  236. data/src/core/lib/transport/static_metadata.h +127 -114
  237. data/src/core/plugin_registry/grpc_plugin_registry.c +16 -0
  238. data/src/core/tsi/fake_transport_security.c +5 -4
  239. data/src/core/tsi/ssl_transport_security.c +71 -82
  240. data/src/core/tsi/ssl_transport_security.h +39 -61
  241. data/src/core/tsi/transport_security.c +83 -2
  242. data/src/core/tsi/transport_security.h +27 -2
  243. data/src/core/tsi/transport_security_adapter.c +236 -0
  244. data/src/core/tsi/transport_security_adapter.h +62 -0
  245. data/src/core/tsi/transport_security_interface.h +179 -66
  246. data/src/ruby/ext/grpc/extconf.rb +2 -1
  247. data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -6
  248. data/src/ruby/ext/grpc/rb_call.c +56 -48
  249. data/src/ruby/ext/grpc/rb_call.h +3 -4
  250. data/src/ruby/ext/grpc/rb_call_credentials.c +23 -22
  251. data/src/ruby/ext/grpc/rb_channel.c +2 -3
  252. data/src/ruby/ext/grpc/rb_channel_args.c +11 -9
  253. data/src/ruby/ext/grpc/rb_channel_credentials.c +16 -12
  254. data/src/ruby/ext/grpc/rb_completion_queue.c +7 -9
  255. data/src/ruby/ext/grpc/rb_compression_options.c +7 -6
  256. data/src/ruby/ext/grpc/rb_event_thread.c +10 -12
  257. data/src/ruby/ext/grpc/rb_event_thread.h +1 -2
  258. data/src/ruby/ext/grpc/rb_grpc.c +11 -15
  259. data/src/ruby/ext/grpc/rb_grpc.h +2 -2
  260. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +16 -6
  261. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +25 -10
  262. data/src/ruby/ext/grpc/rb_server.c +26 -28
  263. data/src/ruby/lib/grpc/grpc.rb +1 -1
  264. data/src/ruby/lib/grpc/version.rb +1 -1
  265. data/third_party/cares/config_linux/ares_config.h +36 -2
  266. data/third_party/zlib/adler32.c +14 -7
  267. data/third_party/zlib/compress.c +24 -18
  268. data/third_party/zlib/crc32.c +29 -12
  269. data/third_party/zlib/deflate.c +499 -303
  270. data/third_party/zlib/deflate.h +19 -16
  271. data/third_party/zlib/gzguts.h +16 -7
  272. data/third_party/zlib/gzlib.c +17 -14
  273. data/third_party/zlib/gzread.c +108 -48
  274. data/third_party/zlib/gzwrite.c +210 -122
  275. data/third_party/zlib/infback.c +2 -2
  276. data/third_party/zlib/inffast.c +34 -51
  277. data/third_party/zlib/inflate.c +86 -37
  278. data/third_party/zlib/inflate.h +7 -4
  279. data/third_party/zlib/inftrees.c +12 -14
  280. data/third_party/zlib/trees.c +38 -61
  281. data/third_party/zlib/uncompr.c +66 -32
  282. data/third_party/zlib/zconf.h +32 -9
  283. data/third_party/zlib/zlib.h +298 -154
  284. data/third_party/zlib/zutil.c +25 -24
  285. data/third_party/zlib/zutil.h +35 -17
  286. metadata +63 -30
@@ -0,0 +1,133 @@
1
+ /*
2
+ *
3
+ * Copyright 2017, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
35
+
36
+ #include <grpc/support/alloc.h>
37
+ #include <grpc/support/atm.h>
38
+ #include <grpc/support/sync.h>
39
+ #include <grpc/support/useful.h>
40
+
41
+ #include "src/core/lib/channel/channel_args.h"
42
+
43
+ #define GRPC_ARG_GRPCLB_CLIENT_STATS "grpc.grpclb_client_stats"
44
+
45
+ struct grpc_grpclb_client_stats {
46
+ gpr_refcount refs;
47
+ gpr_atm num_calls_started;
48
+ gpr_atm num_calls_finished;
49
+ gpr_atm num_calls_finished_with_drop_for_rate_limiting;
50
+ gpr_atm num_calls_finished_with_drop_for_load_balancing;
51
+ gpr_atm num_calls_finished_with_client_failed_to_send;
52
+ gpr_atm num_calls_finished_known_received;
53
+ };
54
+
55
+ grpc_grpclb_client_stats* grpc_grpclb_client_stats_create() {
56
+ grpc_grpclb_client_stats* client_stats = gpr_zalloc(sizeof(*client_stats));
57
+ gpr_ref_init(&client_stats->refs, 1);
58
+ return client_stats;
59
+ }
60
+
61
+ grpc_grpclb_client_stats* grpc_grpclb_client_stats_ref(
62
+ grpc_grpclb_client_stats* client_stats) {
63
+ gpr_ref(&client_stats->refs);
64
+ return client_stats;
65
+ }
66
+
67
+ void grpc_grpclb_client_stats_unref(grpc_grpclb_client_stats* client_stats) {
68
+ if (gpr_unref(&client_stats->refs)) {
69
+ gpr_free(client_stats);
70
+ }
71
+ }
72
+
73
+ void grpc_grpclb_client_stats_add_call_started(
74
+ grpc_grpclb_client_stats* client_stats) {
75
+ gpr_atm_full_fetch_add(&client_stats->num_calls_started, (gpr_atm)1);
76
+ }
77
+
78
+ void grpc_grpclb_client_stats_add_call_finished(
79
+ bool finished_with_drop_for_rate_limiting,
80
+ bool finished_with_drop_for_load_balancing,
81
+ bool finished_with_client_failed_to_send, bool finished_known_received,
82
+ grpc_grpclb_client_stats* client_stats) {
83
+ gpr_atm_full_fetch_add(&client_stats->num_calls_finished, (gpr_atm)1);
84
+ if (finished_with_drop_for_rate_limiting) {
85
+ gpr_atm_full_fetch_add(
86
+ &client_stats->num_calls_finished_with_drop_for_rate_limiting,
87
+ (gpr_atm)1);
88
+ }
89
+ if (finished_with_drop_for_load_balancing) {
90
+ gpr_atm_full_fetch_add(
91
+ &client_stats->num_calls_finished_with_drop_for_load_balancing,
92
+ (gpr_atm)1);
93
+ }
94
+ if (finished_with_client_failed_to_send) {
95
+ gpr_atm_full_fetch_add(
96
+ &client_stats->num_calls_finished_with_client_failed_to_send,
97
+ (gpr_atm)1);
98
+ }
99
+ if (finished_known_received) {
100
+ gpr_atm_full_fetch_add(&client_stats->num_calls_finished_known_received,
101
+ (gpr_atm)1);
102
+ }
103
+ }
104
+
105
+ static void atomic_get_and_reset_counter(int64_t* value, gpr_atm* counter) {
106
+ *value = (int64_t)gpr_atm_acq_load(counter);
107
+ gpr_atm_full_fetch_add(counter, (gpr_atm)(-*value));
108
+ }
109
+
110
+ void grpc_grpclb_client_stats_get(
111
+ grpc_grpclb_client_stats* client_stats, int64_t* num_calls_started,
112
+ int64_t* num_calls_finished,
113
+ int64_t* num_calls_finished_with_drop_for_rate_limiting,
114
+ int64_t* num_calls_finished_with_drop_for_load_balancing,
115
+ int64_t* num_calls_finished_with_client_failed_to_send,
116
+ int64_t* num_calls_finished_known_received) {
117
+ atomic_get_and_reset_counter(num_calls_started,
118
+ &client_stats->num_calls_started);
119
+ atomic_get_and_reset_counter(num_calls_finished,
120
+ &client_stats->num_calls_finished);
121
+ atomic_get_and_reset_counter(
122
+ num_calls_finished_with_drop_for_rate_limiting,
123
+ &client_stats->num_calls_finished_with_drop_for_rate_limiting);
124
+ atomic_get_and_reset_counter(
125
+ num_calls_finished_with_drop_for_load_balancing,
126
+ &client_stats->num_calls_finished_with_drop_for_load_balancing);
127
+ atomic_get_and_reset_counter(
128
+ num_calls_finished_with_client_failed_to_send,
129
+ &client_stats->num_calls_finished_with_client_failed_to_send);
130
+ atomic_get_and_reset_counter(
131
+ num_calls_finished_known_received,
132
+ &client_stats->num_calls_finished_known_received);
133
+ }
@@ -0,0 +1,65 @@
1
+ /*
2
+ *
3
+ * Copyright 2017, Google Inc.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ * * Redistributions in binary form must reproduce the above
13
+ * copyright notice, this list of conditions and the following disclaimer
14
+ * in the documentation and/or other materials provided with the
15
+ * distribution.
16
+ * * Neither the name of Google Inc. nor the names of its
17
+ * contributors may be used to endorse or promote products derived from
18
+ * this software without specific prior written permission.
19
+ *
20
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+ *
32
+ */
33
+
34
+ #ifndef GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_CLIENT_STATS_H
35
+ #define GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_CLIENT_STATS_H
36
+
37
+ #include <stdbool.h>
38
+
39
+ #include <grpc/impl/codegen/grpc_types.h>
40
+
41
+ typedef struct grpc_grpclb_client_stats grpc_grpclb_client_stats;
42
+
43
+ grpc_grpclb_client_stats* grpc_grpclb_client_stats_create();
44
+ grpc_grpclb_client_stats* grpc_grpclb_client_stats_ref(
45
+ grpc_grpclb_client_stats* client_stats);
46
+ void grpc_grpclb_client_stats_unref(grpc_grpclb_client_stats* client_stats);
47
+
48
+ void grpc_grpclb_client_stats_add_call_started(
49
+ grpc_grpclb_client_stats* client_stats);
50
+ void grpc_grpclb_client_stats_add_call_finished(
51
+ bool finished_with_drop_for_rate_limiting,
52
+ bool finished_with_drop_for_load_balancing,
53
+ bool finished_with_client_failed_to_send, bool finished_known_received,
54
+ grpc_grpclb_client_stats* client_stats);
55
+
56
+ void grpc_grpclb_client_stats_get(
57
+ grpc_grpclb_client_stats* client_stats, int64_t* num_calls_started,
58
+ int64_t* num_calls_finished,
59
+ int64_t* num_calls_finished_with_drop_for_rate_limiting,
60
+ int64_t* num_calls_finished_with_drop_for_load_balancing,
61
+ int64_t* num_calls_finished_with_client_failed_to_send,
62
+ int64_t* num_calls_finished_known_received);
63
+
64
+ #endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_CLIENT_STATS_H \
65
+ */
@@ -37,58 +37,83 @@
37
37
 
38
38
  #include <grpc/support/alloc.h>
39
39
 
40
+ /* invoked once for every Server in ServerList */
41
+ static bool count_serverlist(pb_istream_t *stream, const pb_field_t *field,
42
+ void **arg) {
43
+ grpc_grpclb_serverlist *sl = *arg;
44
+ grpc_grpclb_server server;
45
+ if (!pb_decode(stream, grpc_lb_v1_Server_fields, &server)) {
46
+ gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(stream));
47
+ return false;
48
+ }
49
+ ++sl->num_servers;
50
+ return true;
51
+ }
52
+
40
53
  typedef struct decode_serverlist_arg {
41
- /* The first pass counts the number of servers in the server list. The second
42
- * one allocates and decodes. */
43
- bool first_pass;
44
54
  /* The decoding callback is invoked once per server in serverlist. Remember
45
55
  * which index of the serverlist are we currently decoding */
46
56
  size_t decoding_idx;
47
- /* Populated after the first pass. Number of server in the input serverlist */
48
- size_t num_servers;
49
57
  /* The decoded serverlist */
50
- grpc_grpclb_server **servers;
58
+ grpc_grpclb_serverlist *serverlist;
51
59
  } decode_serverlist_arg;
52
60
 
53
61
  /* invoked once for every Server in ServerList */
54
62
  static bool decode_serverlist(pb_istream_t *stream, const pb_field_t *field,
55
63
  void **arg) {
56
64
  decode_serverlist_arg *dec_arg = *arg;
57
- if (dec_arg->first_pass) { /* count how many server do we have */
58
- grpc_grpclb_server server;
59
- if (!pb_decode(stream, grpc_lb_v1_Server_fields, &server)) {
60
- gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(stream));
61
- return false;
62
- }
63
- dec_arg->num_servers++;
64
- } else { /* second pass. Actually decode. */
65
- grpc_grpclb_server *server = gpr_zalloc(sizeof(grpc_grpclb_server));
66
- GPR_ASSERT(dec_arg->num_servers > 0);
67
- if (dec_arg->decoding_idx == 0) { /* first iteration of second pass */
68
- dec_arg->servers =
69
- gpr_malloc(sizeof(grpc_grpclb_server *) * dec_arg->num_servers);
70
- }
71
- if (!pb_decode(stream, grpc_lb_v1_Server_fields, server)) {
72
- gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(stream));
73
- return false;
74
- }
75
- dec_arg->servers[dec_arg->decoding_idx++] = server;
65
+ GPR_ASSERT(dec_arg->serverlist->num_servers >= dec_arg->decoding_idx);
66
+ grpc_grpclb_server *server = gpr_zalloc(sizeof(grpc_grpclb_server));
67
+ if (!pb_decode(stream, grpc_lb_v1_Server_fields, server)) {
68
+ gpr_free(server);
69
+ gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(stream));
70
+ return false;
76
71
  }
77
-
72
+ dec_arg->serverlist->servers[dec_arg->decoding_idx++] = server;
78
73
  return true;
79
74
  }
80
75
 
81
76
  grpc_grpclb_request *grpc_grpclb_request_create(const char *lb_service_name) {
82
77
  grpc_grpclb_request *req = gpr_malloc(sizeof(grpc_grpclb_request));
83
-
84
- req->has_client_stats = 0; /* TODO(dgq): add support for stats once defined */
85
- req->has_initial_request = 1;
86
- req->initial_request.has_name = 1;
78
+ req->has_client_stats = false;
79
+ req->has_initial_request = true;
80
+ req->initial_request.has_name = true;
87
81
  strncpy(req->initial_request.name, lb_service_name,
88
82
  GRPC_GRPCLB_SERVICE_NAME_MAX_LENGTH);
89
83
  return req;
90
84
  }
91
85
 
86
+ static void populate_timestamp(gpr_timespec timestamp,
87
+ struct _grpc_lb_v1_Timestamp *timestamp_pb) {
88
+ timestamp_pb->has_seconds = true;
89
+ timestamp_pb->seconds = timestamp.tv_sec;
90
+ timestamp_pb->has_nanos = true;
91
+ timestamp_pb->nanos = timestamp.tv_nsec;
92
+ }
93
+
94
+ grpc_grpclb_request *grpc_grpclb_load_report_request_create(
95
+ grpc_grpclb_client_stats *client_stats) {
96
+ grpc_grpclb_request *req = gpr_zalloc(sizeof(grpc_grpclb_request));
97
+ req->has_client_stats = true;
98
+ req->client_stats.has_timestamp = true;
99
+ populate_timestamp(gpr_now(GPR_CLOCK_REALTIME), &req->client_stats.timestamp);
100
+ req->client_stats.has_num_calls_started = true;
101
+ req->client_stats.has_num_calls_finished = true;
102
+ req->client_stats.has_num_calls_finished_with_drop_for_rate_limiting = true;
103
+ req->client_stats.has_num_calls_finished_with_drop_for_load_balancing = true;
104
+ req->client_stats.has_num_calls_finished_with_client_failed_to_send = true;
105
+ req->client_stats.has_num_calls_finished_with_client_failed_to_send = true;
106
+ req->client_stats.has_num_calls_finished_known_received = true;
107
+ grpc_grpclb_client_stats_get(
108
+ client_stats, &req->client_stats.num_calls_started,
109
+ &req->client_stats.num_calls_finished,
110
+ &req->client_stats.num_calls_finished_with_drop_for_rate_limiting,
111
+ &req->client_stats.num_calls_finished_with_drop_for_load_balancing,
112
+ &req->client_stats.num_calls_finished_with_client_failed_to_send,
113
+ &req->client_stats.num_calls_finished_known_received);
114
+ return req;
115
+ }
116
+
92
117
  grpc_slice grpc_grpclb_request_encode(const grpc_grpclb_request *request) {
93
118
  size_t encoded_length;
94
119
  pb_ostream_t sizestream;
@@ -98,7 +123,7 @@ grpc_slice grpc_grpclb_request_encode(const grpc_grpclb_request *request) {
98
123
  pb_encode(&sizestream, grpc_lb_v1_LoadBalanceRequest_fields, request);
99
124
  encoded_length = sizestream.bytes_written;
100
125
 
101
- slice = grpc_slice_malloc(encoded_length);
126
+ slice = GRPC_SLICE_MALLOC(encoded_length);
102
127
  outputstream =
103
128
  pb_ostream_from_buffer(GRPC_SLICE_START_PTR(slice), encoded_length);
104
129
  GPR_ASSERT(pb_encode(&outputstream, grpc_lb_v1_LoadBalanceRequest_fields,
@@ -122,6 +147,9 @@ grpc_grpclb_initial_response *grpc_grpclb_initial_response_parse(
122
147
  gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
123
148
  return NULL;
124
149
  }
150
+
151
+ if (!res.has_initial_response) return NULL;
152
+
125
153
  grpc_grpclb_initial_response *initial_res =
126
154
  gpr_malloc(sizeof(grpc_grpclb_initial_response));
127
155
  memcpy(initial_res, &res.initial_response,
@@ -132,36 +160,38 @@ grpc_grpclb_initial_response *grpc_grpclb_initial_response_parse(
132
160
 
133
161
  grpc_grpclb_serverlist *grpc_grpclb_response_parse_serverlist(
134
162
  grpc_slice encoded_grpc_grpclb_response) {
135
- bool status;
136
- decode_serverlist_arg arg;
137
163
  pb_istream_t stream =
138
164
  pb_istream_from_buffer(GRPC_SLICE_START_PTR(encoded_grpc_grpclb_response),
139
165
  GRPC_SLICE_LENGTH(encoded_grpc_grpclb_response));
140
166
  pb_istream_t stream_at_start = stream;
167
+ grpc_grpclb_serverlist *sl = gpr_zalloc(sizeof(grpc_grpclb_serverlist));
141
168
  grpc_grpclb_response res;
142
169
  memset(&res, 0, sizeof(grpc_grpclb_response));
143
- memset(&arg, 0, sizeof(decode_serverlist_arg));
144
-
145
- res.server_list.servers.funcs.decode = decode_serverlist;
146
- res.server_list.servers.arg = &arg;
147
- arg.first_pass = true;
148
- status = pb_decode(&stream, grpc_lb_v1_LoadBalanceResponse_fields, &res);
170
+ // First pass: count number of servers.
171
+ res.server_list.servers.funcs.decode = count_serverlist;
172
+ res.server_list.servers.arg = sl;
173
+ bool status = pb_decode(&stream, grpc_lb_v1_LoadBalanceResponse_fields, &res);
149
174
  if (!status) {
175
+ gpr_free(sl);
150
176
  gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
151
177
  return NULL;
152
178
  }
153
-
154
- arg.first_pass = false;
155
- status =
156
- pb_decode(&stream_at_start, grpc_lb_v1_LoadBalanceResponse_fields, &res);
157
- if (!status) {
158
- gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
159
- return NULL;
179
+ // Second pass: populate servers.
180
+ if (sl->num_servers > 0) {
181
+ sl->servers = gpr_zalloc(sizeof(grpc_grpclb_server *) * sl->num_servers);
182
+ decode_serverlist_arg decode_arg;
183
+ memset(&decode_arg, 0, sizeof(decode_arg));
184
+ decode_arg.serverlist = sl;
185
+ res.server_list.servers.funcs.decode = decode_serverlist;
186
+ res.server_list.servers.arg = &decode_arg;
187
+ status = pb_decode(&stream_at_start, grpc_lb_v1_LoadBalanceResponse_fields,
188
+ &res);
189
+ if (!status) {
190
+ grpc_grpclb_destroy_serverlist(sl);
191
+ gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
192
+ return NULL;
193
+ }
160
194
  }
161
-
162
- grpc_grpclb_serverlist *sl = gpr_zalloc(sizeof(grpc_grpclb_serverlist));
163
- sl->num_servers = arg.num_servers;
164
- sl->servers = arg.servers;
165
195
  if (res.server_list.has_expiration_interval) {
166
196
  sl->expiration_interval = res.server_list.expiration_interval;
167
197
  }
@@ -195,7 +225,7 @@ grpc_grpclb_serverlist *grpc_grpclb_serverlist_copy(
195
225
 
196
226
  bool grpc_grpclb_serverlist_equals(const grpc_grpclb_serverlist *lhs,
197
227
  const grpc_grpclb_serverlist *rhs) {
198
- if ((lhs == NULL) || (rhs == NULL)) {
228
+ if (lhs == NULL || rhs == NULL) {
199
229
  return false;
200
230
  }
201
231
  if (lhs->num_servers != rhs->num_servers) {
@@ -243,6 +273,15 @@ int grpc_grpclb_duration_compare(const grpc_grpclb_duration *lhs,
243
273
  return 0;
244
274
  }
245
275
 
276
+ gpr_timespec grpc_grpclb_duration_to_timespec(
277
+ grpc_grpclb_duration *duration_pb) {
278
+ gpr_timespec duration;
279
+ duration.tv_sec = duration_pb->has_seconds ? duration_pb->seconds : 0;
280
+ duration.tv_nsec = duration_pb->has_nanos ? duration_pb->nanos : 0;
281
+ duration.clock_type = GPR_TIMESPAN;
282
+ return duration;
283
+ }
284
+
246
285
  void grpc_grpclb_initial_response_destroy(
247
286
  grpc_grpclb_initial_response *response) {
248
287
  gpr_free(response);
@@ -36,6 +36,7 @@
36
36
 
37
37
  #include <grpc/slice_buffer.h>
38
38
 
39
+ #include "src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h"
39
40
  #include "src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h"
40
41
  #include "src/core/ext/filters/client_channel/lb_policy_factory.h"
41
42
 
@@ -50,7 +51,7 @@ typedef grpc_lb_v1_LoadBalanceRequest grpc_grpclb_request;
50
51
  typedef grpc_lb_v1_InitialLoadBalanceResponse grpc_grpclb_initial_response;
51
52
  typedef grpc_lb_v1_Server grpc_grpclb_server;
52
53
  typedef grpc_lb_v1_Duration grpc_grpclb_duration;
53
- typedef struct grpc_grpclb_serverlist {
54
+ typedef struct {
54
55
  grpc_grpclb_server **servers;
55
56
  size_t num_servers;
56
57
  grpc_grpclb_duration expiration_interval;
@@ -58,6 +59,8 @@ typedef struct grpc_grpclb_serverlist {
58
59
 
59
60
  /** Create a request for a gRPC LB service under \a lb_service_name */
60
61
  grpc_grpclb_request *grpc_grpclb_request_create(const char *lb_service_name);
62
+ grpc_grpclb_request *grpc_grpclb_load_report_request_create(
63
+ grpc_grpclb_client_stats *client_stats);
61
64
 
62
65
  /** Protocol Buffers v3-encode \a request */
63
66
  grpc_slice grpc_grpclb_request_encode(const grpc_grpclb_request *request);
@@ -93,6 +96,9 @@ void grpc_grpclb_destroy_serverlist(grpc_grpclb_serverlist *serverlist);
93
96
  int grpc_grpclb_duration_compare(const grpc_grpclb_duration *lhs,
94
97
  const grpc_grpclb_duration *rhs);
95
98
 
99
+ gpr_timespec grpc_grpclb_duration_to_timespec(
100
+ grpc_grpclb_duration *duration_pb);
101
+
96
102
  /** Destroy \a initial_response */
97
103
  void grpc_grpclb_initial_response_destroy(
98
104
  grpc_grpclb_initial_response *response);
@@ -16,6 +16,12 @@ const pb_field_t grpc_lb_v1_Duration_fields[3] = {
16
16
  PB_LAST_FIELD
17
17
  };
18
18
 
19
+ const pb_field_t grpc_lb_v1_Timestamp_fields[3] = {
20
+ PB_FIELD( 1, INT64 , OPTIONAL, STATIC , FIRST, grpc_lb_v1_Timestamp, seconds, seconds, 0),
21
+ PB_FIELD( 2, INT32 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_Timestamp, nanos, seconds, 0),
22
+ PB_LAST_FIELD
23
+ };
24
+
19
25
  const pb_field_t grpc_lb_v1_LoadBalanceRequest_fields[3] = {
20
26
  PB_FIELD( 1, MESSAGE , OPTIONAL, STATIC , FIRST, grpc_lb_v1_LoadBalanceRequest, initial_request, initial_request, &grpc_lb_v1_InitialLoadBalanceRequest_fields),
21
27
  PB_FIELD( 2, MESSAGE , OPTIONAL, STATIC , OTHER, grpc_lb_v1_LoadBalanceRequest, client_stats, initial_request, &grpc_lb_v1_ClientStats_fields),
@@ -27,10 +33,14 @@ const pb_field_t grpc_lb_v1_InitialLoadBalanceRequest_fields[2] = {
27
33
  PB_LAST_FIELD
28
34
  };
29
35
 
30
- const pb_field_t grpc_lb_v1_ClientStats_fields[4] = {
31
- PB_FIELD( 1, INT64 , OPTIONAL, STATIC , FIRST, grpc_lb_v1_ClientStats, total_requests, total_requests, 0),
32
- PB_FIELD( 2, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, client_rpc_errors, total_requests, 0),
33
- PB_FIELD( 3, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, dropped_requests, client_rpc_errors, 0),
36
+ const pb_field_t grpc_lb_v1_ClientStats_fields[8] = {
37
+ PB_FIELD( 1, MESSAGE , OPTIONAL, STATIC , FIRST, grpc_lb_v1_ClientStats, timestamp, timestamp, &grpc_lb_v1_Timestamp_fields),
38
+ PB_FIELD( 2, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, num_calls_started, timestamp, 0),
39
+ PB_FIELD( 3, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, num_calls_finished, num_calls_started, 0),
40
+ PB_FIELD( 4, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, num_calls_finished_with_drop_for_rate_limiting, num_calls_finished, 0),
41
+ PB_FIELD( 5, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, num_calls_finished_with_drop_for_load_balancing, num_calls_finished_with_drop_for_rate_limiting, 0),
42
+ PB_FIELD( 6, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, num_calls_finished_with_client_failed_to_send, num_calls_finished_with_drop_for_load_balancing, 0),
43
+ PB_FIELD( 7, INT64 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_ClientStats, num_calls_finished_known_received, num_calls_finished_with_client_failed_to_send, 0),
34
44
  PB_LAST_FIELD
35
45
  };
36
46
 
@@ -52,11 +62,12 @@ const pb_field_t grpc_lb_v1_ServerList_fields[3] = {
52
62
  PB_LAST_FIELD
53
63
  };
54
64
 
55
- const pb_field_t grpc_lb_v1_Server_fields[5] = {
65
+ const pb_field_t grpc_lb_v1_Server_fields[6] = {
56
66
  PB_FIELD( 1, BYTES , OPTIONAL, STATIC , FIRST, grpc_lb_v1_Server, ip_address, ip_address, 0),
57
67
  PB_FIELD( 2, INT32 , OPTIONAL, STATIC , OTHER, grpc_lb_v1_Server, port, ip_address, 0),
58
68
  PB_FIELD( 3, STRING , OPTIONAL, STATIC , OTHER, grpc_lb_v1_Server, load_balance_token, port, 0),
59
- PB_FIELD( 4, BOOL , OPTIONAL, STATIC , OTHER, grpc_lb_v1_Server, drop_request, load_balance_token, 0),
69
+ PB_FIELD( 4, BOOL , OPTIONAL, STATIC , OTHER, grpc_lb_v1_Server, drop_for_rate_limiting, load_balance_token, 0),
70
+ PB_FIELD( 5, BOOL , OPTIONAL, STATIC , OTHER, grpc_lb_v1_Server, drop_for_load_balancing, drop_for_rate_limiting, 0),
60
71
  PB_LAST_FIELD
61
72
  };
62
73
 
@@ -70,7 +81,7 @@ const pb_field_t grpc_lb_v1_Server_fields[5] = {
70
81
  * numbers or field sizes that are larger than what can fit in 8 or 16 bit
71
82
  * field descriptors.
72
83
  */
73
- PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceRequest, client_stats) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, initial_response) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, server_list) < 65536 && pb_membersize(grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval) < 65536 && pb_membersize(grpc_lb_v1_ServerList, servers) < 65536 && pb_membersize(grpc_lb_v1_ServerList, expiration_interval) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_grpc_lb_v1_Duration_grpc_lb_v1_LoadBalanceRequest_grpc_lb_v1_InitialLoadBalanceRequest_grpc_lb_v1_ClientStats_grpc_lb_v1_LoadBalanceResponse_grpc_lb_v1_InitialLoadBalanceResponse_grpc_lb_v1_ServerList_grpc_lb_v1_Server)
84
+ PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceRequest, client_stats) < 65536 && pb_membersize(grpc_lb_v1_ClientStats, timestamp) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, initial_response) < 65536 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, server_list) < 65536 && pb_membersize(grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval) < 65536 && pb_membersize(grpc_lb_v1_ServerList, servers) < 65536 && pb_membersize(grpc_lb_v1_ServerList, expiration_interval) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_grpc_lb_v1_Duration_grpc_lb_v1_Timestamp_grpc_lb_v1_LoadBalanceRequest_grpc_lb_v1_InitialLoadBalanceRequest_grpc_lb_v1_ClientStats_grpc_lb_v1_LoadBalanceResponse_grpc_lb_v1_InitialLoadBalanceResponse_grpc_lb_v1_ServerList_grpc_lb_v1_Server)
74
85
  #endif
75
86
 
76
87
  #if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)
@@ -81,7 +92,7 @@ PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request)
81
92
  * numbers or field sizes that are larger than what can fit in the default
82
93
  * 8 bit descriptors.
83
94
  */
84
- PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceRequest, client_stats) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, initial_response) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, server_list) < 256 && pb_membersize(grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval) < 256 && pb_membersize(grpc_lb_v1_ServerList, servers) < 256 && pb_membersize(grpc_lb_v1_ServerList, expiration_interval) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_grpc_lb_v1_Duration_grpc_lb_v1_LoadBalanceRequest_grpc_lb_v1_InitialLoadBalanceRequest_grpc_lb_v1_ClientStats_grpc_lb_v1_LoadBalanceResponse_grpc_lb_v1_InitialLoadBalanceResponse_grpc_lb_v1_ServerList_grpc_lb_v1_Server)
95
+ PB_STATIC_ASSERT((pb_membersize(grpc_lb_v1_LoadBalanceRequest, initial_request) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceRequest, client_stats) < 256 && pb_membersize(grpc_lb_v1_ClientStats, timestamp) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, initial_response) < 256 && pb_membersize(grpc_lb_v1_LoadBalanceResponse, server_list) < 256 && pb_membersize(grpc_lb_v1_InitialLoadBalanceResponse, client_stats_report_interval) < 256 && pb_membersize(grpc_lb_v1_ServerList, servers) < 256 && pb_membersize(grpc_lb_v1_ServerList, expiration_interval) < 256), YOU_MUST_DEFINE_PB_FIELD_16BIT_FOR_MESSAGES_grpc_lb_v1_Duration_grpc_lb_v1_Timestamp_grpc_lb_v1_LoadBalanceRequest_grpc_lb_v1_InitialLoadBalanceRequest_grpc_lb_v1_ClientStats_grpc_lb_v1_LoadBalanceResponse_grpc_lb_v1_InitialLoadBalanceResponse_grpc_lb_v1_ServerList_grpc_lb_v1_Server)
85
96
  #endif
86
97
 
87
98