wearefair-grpc 1.3.1.pre.c → 1.4.0.fair

Sign up to get free protection for your applications and to get access to all the features.
Files changed (219) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +418 -126
  3. data/include/grpc/grpc.h +15 -69
  4. data/include/grpc/grpc_security.h +1 -1
  5. data/include/grpc/impl/codegen/compression_types.h +3 -4
  6. data/include/grpc/impl/codegen/gpr_types.h +0 -1
  7. data/include/grpc/impl/codegen/grpc_types.h +69 -3
  8. data/include/grpc/impl/codegen/port_platform.h +6 -0
  9. data/include/grpc/impl/codegen/slice.h +2 -1
  10. data/include/grpc/load_reporting.h +6 -6
  11. data/include/grpc/slice.h +25 -3
  12. data/include/grpc/slice_buffer.h +4 -0
  13. data/src/core/ext/census/context.c +1 -1
  14. data/src/core/ext/census/resource.c +3 -1
  15. data/src/core/ext/filters/client_channel/channel_connectivity.c +1 -1
  16. data/src/core/ext/filters/client_channel/client_channel.c +158 -100
  17. data/src/core/ext/filters/client_channel/client_channel_plugin.c +3 -2
  18. data/src/core/ext/filters/client_channel/lb_policy.c +2 -1
  19. data/src/core/ext/filters/client_channel/lb_policy.h +5 -6
  20. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c +153 -0
  21. data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +42 -0
  22. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c +344 -88
  23. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c +133 -0
  24. data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +65 -0
  25. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c +47 -5
  26. data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -0
  27. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +19 -8
  28. data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +63 -34
  29. data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c +2 -1
  30. data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c +13 -12
  31. data/src/core/ext/filters/client_channel/lb_policy_factory.c +28 -5
  32. data/src/core/ext/filters/client_channel/lb_policy_factory.h +18 -4
  33. data/src/core/ext/filters/client_channel/parse_address.c +37 -7
  34. data/src/core/ext/filters/client_channel/parse_address.h +11 -8
  35. data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.c +3 -3
  36. data/src/core/ext/filters/client_channel/subchannel.c +19 -16
  37. data/src/core/ext/filters/client_channel/subchannel.h +1 -0
  38. data/src/core/ext/filters/client_channel/uri_parser.c +36 -22
  39. data/src/core/ext/filters/client_channel/uri_parser.h +1 -1
  40. data/src/core/{lib/channel → ext/filters/deadline}/deadline_filter.c +42 -17
  41. data/src/core/{lib/channel → ext/filters/deadline}/deadline_filter.h +8 -9
  42. data/src/core/{lib/channel → ext/filters/http/client}/http_client_filter.c +19 -11
  43. data/src/core/{lib/channel → ext/filters/http/client}/http_client_filter.h +3 -6
  44. data/src/core/ext/filters/http/http_filters_plugin.c +104 -0
  45. data/src/core/{lib/channel/compress_filter.c → ext/filters/http/message_compress/message_compress_filter.c} +124 -23
  46. data/src/core/{lib/channel/compress_filter.h → ext/filters/http/message_compress/message_compress_filter.h} +5 -6
  47. data/src/core/{lib/channel → ext/filters/http/server}/http_server_filter.c +4 -6
  48. data/src/core/{lib/channel → ext/filters/http/server}/http_server_filter.h +3 -3
  49. data/src/core/ext/filters/load_reporting/load_reporting.c +2 -25
  50. data/src/core/ext/filters/load_reporting/load_reporting_filter.c +26 -1
  51. data/src/core/ext/filters/max_age/max_age_filter.c +14 -14
  52. data/src/core/{lib/channel → ext/filters/message_size}/message_size_filter.c +91 -47
  53. data/src/core/{lib/channel → ext/filters/message_size}/message_size_filter.h +3 -3
  54. data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +1 -1
  55. data/src/core/ext/transport/chttp2/server/chttp2_server.c +2 -2
  56. data/src/core/ext/transport/chttp2/transport/bin_decoder.c +2 -2
  57. data/src/core/ext/transport/chttp2/transport/bin_encoder.c +3 -3
  58. data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +296 -172
  59. data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -2
  60. data/src/core/ext/transport/chttp2/transport/frame_data.c +203 -164
  61. data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -14
  62. data/src/core/ext/transport/chttp2/transport/frame_goaway.c +1 -1
  63. data/src/core/ext/transport/chttp2/transport/frame_ping.c +1 -1
  64. data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +1 -1
  65. data/src/core/ext/transport/chttp2/transport/frame_settings.c +5 -5
  66. data/src/core/ext/transport/chttp2/transport/frame_window_update.c +1 -1
  67. data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +4 -4
  68. data/src/core/ext/transport/chttp2/transport/hpack_parser.c +2 -4
  69. data/src/core/ext/transport/chttp2/transport/hpack_table.c +4 -3
  70. data/src/core/ext/transport/chttp2/transport/internal.h +50 -33
  71. data/src/core/ext/transport/chttp2/transport/parsing.c +10 -11
  72. data/src/core/ext/transport/chttp2/transport/writing.c +32 -13
  73. data/src/core/lib/channel/channel_args.c +28 -9
  74. data/src/core/lib/channel/channel_args.h +5 -1
  75. data/src/core/lib/channel/channel_stack.c +1 -1
  76. data/src/core/lib/channel/channel_stack.h +2 -2
  77. data/src/core/lib/channel/channel_stack_builder.c +13 -1
  78. data/src/core/lib/channel/channel_stack_builder.h +5 -1
  79. data/src/core/lib/channel/connected_channel.c +3 -1
  80. data/src/core/lib/channel/context.h +2 -2
  81. data/src/core/lib/compression/message_compress.c +2 -2
  82. data/src/core/lib/debug/trace.c +13 -6
  83. data/src/core/lib/debug/trace.h +27 -1
  84. data/src/core/lib/http/httpcli.c +1 -1
  85. data/src/core/lib/http/httpcli_security_connector.c +6 -10
  86. data/src/core/lib/http/parser.c +2 -2
  87. data/src/core/lib/http/parser.h +2 -1
  88. data/src/core/lib/iomgr/combiner.c +6 -6
  89. data/src/core/lib/iomgr/combiner.h +2 -1
  90. data/src/core/lib/iomgr/error.c +12 -5
  91. data/src/core/lib/iomgr/error.h +13 -13
  92. data/src/core/lib/iomgr/ev_epoll1_linux.c +984 -0
  93. data/src/core/lib/iomgr/ev_epoll1_linux.h +44 -0
  94. data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c +2146 -0
  95. data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.h +43 -0
  96. data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.c +1337 -0
  97. data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.h +43 -0
  98. data/src/core/lib/iomgr/ev_epollex_linux.c +1511 -0
  99. data/src/core/lib/iomgr/ev_epollex_linux.h +43 -0
  100. data/src/core/lib/iomgr/{ev_epoll_linux.c → ev_epollsig_linux.c} +24 -31
  101. data/src/core/lib/iomgr/{ev_epoll_linux.h → ev_epollsig_linux.h} +4 -4
  102. data/src/core/lib/iomgr/ev_poll_posix.c +12 -27
  103. data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
  104. data/src/core/lib/iomgr/ev_posix.c +22 -8
  105. data/src/core/lib/iomgr/ev_posix.h +4 -3
  106. data/src/core/lib/iomgr/exec_ctx.c +5 -0
  107. data/src/core/lib/iomgr/exec_ctx.h +2 -0
  108. data/src/core/lib/iomgr/iomgr.c +4 -0
  109. data/src/core/lib/iomgr/iomgr.h +3 -0
  110. data/src/core/lib/iomgr/is_epollexclusive_available.c +116 -0
  111. data/src/core/lib/iomgr/is_epollexclusive_available.h +41 -0
  112. data/src/core/lib/iomgr/lockfree_event.c +16 -0
  113. data/src/core/lib/iomgr/pollset.h +2 -5
  114. data/src/core/lib/iomgr/pollset_uv.c +1 -1
  115. data/src/core/lib/iomgr/pollset_windows.c +3 -3
  116. data/src/core/lib/iomgr/resource_quota.c +9 -8
  117. data/src/core/lib/iomgr/resource_quota.h +2 -1
  118. data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
  119. data/src/core/lib/iomgr/socket_mutator.h +2 -0
  120. data/src/core/lib/iomgr/sys_epoll_wrapper.h +43 -0
  121. data/src/core/lib/iomgr/tcp_client_posix.c +6 -6
  122. data/src/core/lib/iomgr/tcp_client_uv.c +3 -3
  123. data/src/core/lib/iomgr/tcp_posix.c +7 -7
  124. data/src/core/lib/iomgr/tcp_posix.h +2 -1
  125. data/src/core/lib/iomgr/tcp_server_posix.c +1 -1
  126. data/src/core/lib/iomgr/tcp_uv.c +6 -6
  127. data/src/core/lib/iomgr/tcp_uv.h +2 -1
  128. data/src/core/lib/iomgr/tcp_windows.c +1 -1
  129. data/src/core/lib/iomgr/timer_generic.c +24 -25
  130. data/src/core/lib/iomgr/timer_manager.c +276 -0
  131. data/src/core/lib/iomgr/timer_manager.h +52 -0
  132. data/src/core/lib/iomgr/timer_uv.c +6 -0
  133. data/src/core/lib/iomgr/udp_server.c +42 -9
  134. data/src/core/lib/iomgr/udp_server.h +3 -1
  135. data/src/core/lib/security/credentials/credentials.c +0 -1
  136. data/src/core/lib/security/credentials/fake/fake_credentials.c +23 -0
  137. data/src/core/lib/security/credentials/fake/fake_credentials.h +12 -9
  138. data/src/core/lib/security/credentials/google_default/google_default_credentials.c +1 -1
  139. data/src/core/lib/security/credentials/jwt/jwt_credentials.c +1 -1
  140. data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +1 -1
  141. data/src/core/lib/security/credentials/ssl/ssl_credentials.c +24 -53
  142. data/src/core/lib/security/transport/client_auth_filter.c +9 -3
  143. data/src/core/lib/security/transport/secure_endpoint.c +7 -7
  144. data/src/core/lib/security/transport/secure_endpoint.h +1 -1
  145. data/src/core/lib/security/transport/security_connector.c +32 -51
  146. data/src/core/lib/security/transport/security_connector.h +10 -14
  147. data/src/core/lib/slice/b64.c +1 -1
  148. data/src/core/lib/slice/percent_encoding.c +3 -3
  149. data/src/core/lib/slice/slice.c +66 -33
  150. data/src/core/lib/slice/slice_buffer.c +25 -6
  151. data/src/core/lib/slice/slice_hash_table.c +33 -35
  152. data/src/core/lib/slice/slice_hash_table.h +7 -12
  153. data/src/core/lib/support/atomic.h +45 -0
  154. data/src/core/lib/support/atomic_with_atm.h +70 -0
  155. data/src/core/lib/support/atomic_with_std.h +48 -0
  156. data/src/core/lib/support/avl.c +14 -14
  157. data/src/core/lib/support/memory.h +74 -0
  158. data/src/core/lib/support/mpscq.c +12 -1
  159. data/src/core/lib/support/mpscq.h +4 -0
  160. data/src/core/lib/support/stack_lockfree.c +3 -36
  161. data/src/core/lib/support/time_posix.c +8 -0
  162. data/src/core/lib/support/tmpfile_posix.c +10 -10
  163. data/src/core/lib/surface/alarm.c +3 -1
  164. data/src/core/lib/surface/api_trace.c +2 -1
  165. data/src/core/lib/surface/api_trace.h +2 -2
  166. data/src/core/lib/surface/byte_buffer_reader.c +1 -1
  167. data/src/core/lib/surface/call.c +65 -22
  168. data/src/core/lib/surface/call.h +4 -2
  169. data/src/core/lib/surface/channel_init.c +2 -19
  170. data/src/core/lib/surface/channel_stack_type.c +18 -0
  171. data/src/core/lib/surface/channel_stack_type.h +2 -0
  172. data/src/core/lib/surface/completion_queue.c +249 -83
  173. data/src/core/lib/surface/completion_queue.h +18 -13
  174. data/src/core/lib/surface/completion_queue_factory.c +24 -9
  175. data/src/core/lib/surface/init.c +1 -52
  176. data/src/core/lib/surface/{lame_client.c → lame_client.cc} +37 -26
  177. data/src/core/lib/surface/server.c +50 -27
  178. data/src/core/lib/surface/server.h +2 -1
  179. data/src/core/lib/surface/version.c +2 -2
  180. data/src/core/lib/transport/bdp_estimator.c +20 -9
  181. data/src/core/lib/transport/bdp_estimator.h +5 -1
  182. data/src/core/lib/transport/byte_stream.c +23 -9
  183. data/src/core/lib/transport/byte_stream.h +15 -6
  184. data/src/core/lib/transport/connectivity_state.c +6 -6
  185. data/src/core/lib/transport/connectivity_state.h +2 -1
  186. data/src/core/lib/transport/service_config.c +6 -13
  187. data/src/core/lib/transport/service_config.h +2 -2
  188. data/src/core/lib/transport/static_metadata.c +403 -389
  189. data/src/core/lib/transport/static_metadata.h +127 -114
  190. data/src/core/plugin_registry/grpc_plugin_registry.c +12 -0
  191. data/src/core/tsi/fake_transport_security.c +5 -4
  192. data/src/core/tsi/ssl_transport_security.c +71 -82
  193. data/src/core/tsi/ssl_transport_security.h +39 -61
  194. data/src/core/tsi/transport_security.c +83 -2
  195. data/src/core/tsi/transport_security.h +27 -2
  196. data/src/core/tsi/transport_security_adapter.c +236 -0
  197. data/src/core/tsi/transport_security_adapter.h +62 -0
  198. data/src/core/tsi/transport_security_interface.h +179 -66
  199. data/src/ruby/ext/grpc/extconf.rb +2 -1
  200. data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -6
  201. data/src/ruby/ext/grpc/rb_call.c +56 -48
  202. data/src/ruby/ext/grpc/rb_call.h +3 -4
  203. data/src/ruby/ext/grpc/rb_call_credentials.c +23 -22
  204. data/src/ruby/ext/grpc/rb_channel.c +45 -29
  205. data/src/ruby/ext/grpc/rb_channel_args.c +11 -9
  206. data/src/ruby/ext/grpc/rb_channel_credentials.c +16 -12
  207. data/src/ruby/ext/grpc/rb_completion_queue.c +7 -9
  208. data/src/ruby/ext/grpc/rb_compression_options.c +7 -6
  209. data/src/ruby/ext/grpc/rb_event_thread.c +10 -12
  210. data/src/ruby/ext/grpc/rb_event_thread.h +1 -2
  211. data/src/ruby/ext/grpc/rb_grpc.c +11 -15
  212. data/src/ruby/ext/grpc/rb_grpc.h +2 -2
  213. data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +14 -6
  214. data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +22 -10
  215. data/src/ruby/ext/grpc/rb_server.c +26 -28
  216. data/src/ruby/lib/grpc/version.rb +1 -1
  217. metadata +40 -18
  218. data/src/ruby/lib/grpc/grpc_c.bundle +0 -0
  219. data/src/ruby/lib/grpc/grpc_c.so +0 -0
@@ -62,6 +62,11 @@ bool grpc_always_ready_to_finish(grpc_exec_ctx *exec_ctx, void *arg_ignored) {
62
62
  return true;
63
63
  }
64
64
 
65
+ bool grpc_exec_ctx_has_work(grpc_exec_ctx *exec_ctx) {
66
+ return exec_ctx->active_combiner != NULL ||
67
+ !grpc_closure_list_empty(exec_ctx->closure_list);
68
+ }
69
+
65
70
  bool grpc_exec_ctx_flush(grpc_exec_ctx *exec_ctx) {
66
71
  bool did_something = 0;
67
72
  GPR_TIMER_BEGIN("grpc_exec_ctx_flush", 0);
@@ -93,6 +93,8 @@ struct grpc_exec_ctx {
93
93
 
94
94
  extern grpc_closure_scheduler *grpc_schedule_on_exec_ctx;
95
95
 
96
+ bool grpc_exec_ctx_has_work(grpc_exec_ctx *exec_ctx);
97
+
96
98
  /** Flush any work that has been enqueued onto this grpc_exec_ctx.
97
99
  * Caller must guarantee that no interfering locks are held.
98
100
  * Returns true if work was performed, false otherwise. */
@@ -47,6 +47,7 @@
47
47
  #include "src/core/lib/iomgr/iomgr_internal.h"
48
48
  #include "src/core/lib/iomgr/network_status_tracker.h"
49
49
  #include "src/core/lib/iomgr/timer.h"
50
+ #include "src/core/lib/iomgr/timer_manager.h"
50
51
  #include "src/core/lib/support/env.h"
51
52
  #include "src/core/lib/support/string.h"
52
53
 
@@ -67,6 +68,8 @@ void grpc_iomgr_init(void) {
67
68
  grpc_iomgr_platform_init();
68
69
  }
69
70
 
71
+ void grpc_iomgr_start(void) { grpc_timer_manager_init(); }
72
+
70
73
  static size_t count_objects(void) {
71
74
  grpc_iomgr_object *obj;
72
75
  size_t n = 0;
@@ -88,6 +91,7 @@ void grpc_iomgr_shutdown(grpc_exec_ctx *exec_ctx) {
88
91
  gpr_now(GPR_CLOCK_REALTIME), gpr_time_from_seconds(10, GPR_TIMESPAN));
89
92
  gpr_timespec last_warning_time = gpr_now(GPR_CLOCK_REALTIME);
90
93
 
94
+ grpc_timer_manager_shutdown();
91
95
  grpc_iomgr_platform_flush();
92
96
 
93
97
  gpr_mu_lock(&g_mu);
@@ -40,6 +40,9 @@
40
40
  /** Initializes the iomgr. */
41
41
  void grpc_iomgr_init(void);
42
42
 
43
+ /** Starts any background threads for iomgr. */
44
+ void grpc_iomgr_start(void);
45
+
43
46
  /** Signals the intention to shutdown the iomgr. Expects to be able to flush
44
47
  * exec_ctx. */
45
48
  void grpc_iomgr_shutdown(grpc_exec_ctx *exec_ctx);
@@ -0,0 +1,116 @@
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/lib/iomgr/port.h"
35
+
36
+ #include "src/core/lib/iomgr/is_epollexclusive_available.h"
37
+
38
+ #ifdef GRPC_LINUX_EPOLL
39
+
40
+ #include <grpc/support/log.h>
41
+
42
+ #include <errno.h>
43
+ #include <sys/eventfd.h>
44
+ #include <unistd.h>
45
+
46
+ #include "src/core/lib/iomgr/sys_epoll_wrapper.h"
47
+
48
+ /* This polling engine is only relevant on linux kernels supporting epoll() */
49
+ bool grpc_is_epollexclusive_available(void) {
50
+ static bool logged_why_not = false;
51
+
52
+ int fd = epoll_create1(EPOLL_CLOEXEC);
53
+ if (fd < 0) {
54
+ if (!logged_why_not) {
55
+ gpr_log(GPR_ERROR,
56
+ "epoll_create1 failed with error: %d. Not using epollex polling "
57
+ "engine.",
58
+ fd);
59
+ logged_why_not = true;
60
+ }
61
+ return false;
62
+ }
63
+ int evfd = eventfd(0, EFD_NONBLOCK | EFD_CLOEXEC);
64
+ if (evfd < 0) {
65
+ if (!logged_why_not) {
66
+ gpr_log(GPR_ERROR,
67
+ "eventfd failed with error: %d. Not using epollex polling "
68
+ "engine.",
69
+ fd);
70
+ logged_why_not = true;
71
+ }
72
+ close(fd);
73
+ return false;
74
+ }
75
+ struct epoll_event ev = {
76
+ /* choose events that should cause an error on
77
+ EPOLLEXCLUSIVE enabled kernels - specifically the combination of
78
+ EPOLLONESHOT and EPOLLEXCLUSIVE */
79
+ .events = (uint32_t)(EPOLLET | EPOLLIN | EPOLLEXCLUSIVE | EPOLLONESHOT),
80
+ .data.ptr = NULL};
81
+ if (epoll_ctl(fd, EPOLL_CTL_ADD, evfd, &ev) != 0) {
82
+ if (errno != EINVAL) {
83
+ if (!logged_why_not) {
84
+ gpr_log(
85
+ GPR_ERROR,
86
+ "epoll_ctl with EPOLLEXCLUSIVE | EPOLLONESHOT failed with error: "
87
+ "%d. Not using epollex polling engine.",
88
+ errno);
89
+ logged_why_not = true;
90
+ }
91
+ close(fd);
92
+ close(evfd);
93
+ return false;
94
+ }
95
+ } else {
96
+ if (!logged_why_not) {
97
+ gpr_log(GPR_ERROR,
98
+ "epoll_ctl with EPOLLEXCLUSIVE | EPOLLONESHOT succeeded. This is "
99
+ "evidence of no EPOLLEXCLUSIVE support. Not using "
100
+ "epollex polling engine.");
101
+ logged_why_not = true;
102
+ }
103
+ close(fd);
104
+ close(evfd);
105
+ return false;
106
+ }
107
+ close(evfd);
108
+ close(fd);
109
+ return true;
110
+ }
111
+
112
+ #else
113
+
114
+ bool grpc_is_epollexclusive_available(void) { return false; }
115
+
116
+ #endif
@@ -0,0 +1,41 @@
1
+ /*
2
+ *
3
+ * Copyright 2015, 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_LIB_IOMGR_IS_EPOLLEXCLUSIVE_AVAILABLE_H
35
+ #define GRPC_CORE_LIB_IOMGR_IS_EPOLLEXCLUSIVE_AVAILABLE_H
36
+
37
+ #include <stdbool.h>
38
+
39
+ bool grpc_is_epollexclusive_available(void);
40
+
41
+ #endif /* GRPC_CORE_LIB_IOMGR_IS_EPOLLEXCLUSIVE_AVAILABLE_H */
@@ -35,6 +35,10 @@
35
35
 
36
36
  #include <grpc/support/log.h>
37
37
 
38
+ #include "src/core/lib/debug/trace.h"
39
+
40
+ extern grpc_tracer_flag grpc_polling_trace;
41
+
38
42
  /* 'state' holds the to call when the fd is readable or writable respectively.
39
43
  It can contain one of the following values:
40
44
  CLOSURE_READY : The fd has an I/O event of interest but there is no
@@ -93,6 +97,10 @@ void grpc_lfev_notify_on(grpc_exec_ctx *exec_ctx, gpr_atm *state,
93
97
  grpc_closure *closure) {
94
98
  while (true) {
95
99
  gpr_atm curr = gpr_atm_no_barrier_load(state);
100
+ if (GRPC_TRACER_ON(grpc_polling_trace)) {
101
+ gpr_log(GPR_DEBUG, "lfev_notify_on: %p curr=%p closure=%p", state,
102
+ (void *)curr, closure);
103
+ }
96
104
  switch (curr) {
97
105
  case CLOSURE_NOT_READY: {
98
106
  /* CLOSURE_NOT_READY -> <closure>.
@@ -155,6 +163,10 @@ bool grpc_lfev_set_shutdown(grpc_exec_ctx *exec_ctx, gpr_atm *state,
155
163
 
156
164
  while (true) {
157
165
  gpr_atm curr = gpr_atm_no_barrier_load(state);
166
+ if (GRPC_TRACER_ON(grpc_polling_trace)) {
167
+ gpr_log(GPR_DEBUG, "lfev_set_shutdown: %p curr=%p err=%s", state,
168
+ (void *)curr, grpc_error_string(shutdown_err));
169
+ }
158
170
  switch (curr) {
159
171
  case CLOSURE_READY:
160
172
  case CLOSURE_NOT_READY:
@@ -200,6 +212,10 @@ void grpc_lfev_set_ready(grpc_exec_ctx *exec_ctx, gpr_atm *state) {
200
212
  while (true) {
201
213
  gpr_atm curr = gpr_atm_no_barrier_load(state);
202
214
 
215
+ if (GRPC_TRACER_ON(grpc_polling_trace)) {
216
+ gpr_log(GPR_DEBUG, "lfev_set_ready: %p curr=%p", state, (void *)curr);
217
+ }
218
+
203
219
  switch (curr) {
204
220
  case CLOSURE_READY: {
205
221
  /* Already ready. We are done here */
@@ -40,8 +40,6 @@
40
40
 
41
41
  #include "src/core/lib/iomgr/exec_ctx.h"
42
42
 
43
- #define GRPC_POLLSET_KICK_BROADCAST ((grpc_pollset_worker *)1)
44
-
45
43
  /* A grpc_pollset is a set of file descriptors that a higher level item is
46
44
  interested in. For example:
47
45
  - a server will typically keep a pollset containing all connected channels,
@@ -59,7 +57,7 @@ void grpc_pollset_init(grpc_pollset *pollset, gpr_mu **mu);
59
57
  * pollset's mutex must be held */
60
58
  void grpc_pollset_shutdown(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
61
59
  grpc_closure *closure);
62
- void grpc_pollset_destroy(grpc_pollset *pollset);
60
+ void grpc_pollset_destroy(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset);
63
61
 
64
62
  /* Do some work on a pollset.
65
63
  May involve invoking asynchronous callbacks, or actually polling file
@@ -88,8 +86,7 @@ grpc_error *grpc_pollset_work(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
88
86
  gpr_timespec deadline) GRPC_MUST_USE_RESULT;
89
87
 
90
88
  /* Break one polling thread out of polling work for this pollset.
91
- If specific_worker is GRPC_POLLSET_KICK_BROADCAST, kick ALL the workers.
92
- Otherwise, if specific_worker is non-NULL, then kick that worker. */
89
+ If specific_worker is non-NULL, then kick that worker. */
93
90
  grpc_error *grpc_pollset_kick(grpc_pollset *pollset,
94
91
  grpc_pollset_worker *specific_worker)
95
92
  GRPC_MUST_USE_RESULT;
@@ -106,7 +106,7 @@ void grpc_pollset_shutdown(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
106
106
  grpc_closure_sched(exec_ctx, closure, GRPC_ERROR_NONE);
107
107
  }
108
108
 
109
- void grpc_pollset_destroy(grpc_pollset *pollset) {
109
+ void grpc_pollset_destroy(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset) {
110
110
  uv_close((uv_handle_t *)&pollset->timer, timer_close_cb);
111
111
  // timer.data is a boolean indicating that the timer has finished closing
112
112
  pollset->timer.data = (void *)0;
@@ -43,6 +43,8 @@
43
43
  #include "src/core/lib/iomgr/pollset.h"
44
44
  #include "src/core/lib/iomgr/pollset_windows.h"
45
45
 
46
+ #define GRPC_POLLSET_KICK_BROADCAST ((grpc_pollset_worker *)1)
47
+
46
48
  gpr_mu grpc_polling_mu;
47
49
  static grpc_pollset_worker *g_active_poller;
48
50
  static grpc_pollset_worker g_global_root_worker;
@@ -114,7 +116,7 @@ void grpc_pollset_shutdown(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
114
116
  }
115
117
  }
116
118
 
117
- void grpc_pollset_destroy(grpc_pollset *pollset) {}
119
+ void grpc_pollset_destroy(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset) {}
118
120
 
119
121
  grpc_error *grpc_pollset_work(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
120
122
  grpc_pollset_worker **worker_hdl,
@@ -227,6 +229,4 @@ grpc_error *grpc_pollset_kick(grpc_pollset *p,
227
229
  return GRPC_ERROR_NONE;
228
230
  }
229
231
 
230
- void grpc_kick_poller(void) { grpc_iocp_kick(); }
231
-
232
232
  #endif /* GRPC_WINSOCK_SOCKET */
@@ -44,7 +44,7 @@
44
44
 
45
45
  #include "src/core/lib/iomgr/combiner.h"
46
46
 
47
- int grpc_resource_quota_trace = 0;
47
+ grpc_tracer_flag grpc_resource_quota_trace = GRPC_TRACER_INITIALIZER(false);
48
48
 
49
49
  #define MEMORY_USAGE_ESTIMATION_MAX 65536
50
50
 
@@ -307,13 +307,14 @@ static bool rq_alloc(grpc_exec_ctx *exec_ctx,
307
307
  resource_user->free_pool = 0;
308
308
  resource_quota->free_pool -= amt;
309
309
  rq_update_estimate(resource_quota);
310
- if (grpc_resource_quota_trace) {
310
+ if (GRPC_TRACER_ON(grpc_resource_quota_trace)) {
311
311
  gpr_log(GPR_DEBUG, "RQ %s %s: grant alloc %" PRId64
312
312
  " bytes; rq_free_pool -> %" PRId64,
313
313
  resource_quota->name, resource_user->name, amt,
314
314
  resource_quota->free_pool);
315
315
  }
316
- } else if (grpc_resource_quota_trace && resource_user->free_pool >= 0) {
316
+ } else if (GRPC_TRACER_ON(grpc_resource_quota_trace) &&
317
+ resource_user->free_pool >= 0) {
317
318
  gpr_log(GPR_DEBUG, "RQ %s %s: discard already satisfied alloc request",
318
319
  resource_quota->name, resource_user->name);
319
320
  }
@@ -342,7 +343,7 @@ static bool rq_reclaim_from_per_user_free_pool(
342
343
  resource_user->free_pool = 0;
343
344
  resource_quota->free_pool += amt;
344
345
  rq_update_estimate(resource_quota);
345
- if (grpc_resource_quota_trace) {
346
+ if (GRPC_TRACER_ON(grpc_resource_quota_trace)) {
346
347
  gpr_log(GPR_DEBUG, "RQ %s %s: reclaim_from_per_user_free_pool %" PRId64
347
348
  " bytes; rq_free_pool -> %" PRId64,
348
349
  resource_quota->name, resource_user->name, amt,
@@ -365,7 +366,7 @@ static bool rq_reclaim(grpc_exec_ctx *exec_ctx,
365
366
  : GRPC_RULIST_RECLAIMER_BENIGN;
366
367
  grpc_resource_user *resource_user = rulist_pop_head(resource_quota, list);
367
368
  if (resource_user == NULL) return false;
368
- if (grpc_resource_quota_trace) {
369
+ if (GRPC_TRACER_ON(grpc_resource_quota_trace)) {
369
370
  gpr_log(GPR_DEBUG, "RQ %s %s: initiate %s reclamation",
370
371
  resource_quota->name, resource_user->name,
371
372
  destructive ? "destructive" : "benign");
@@ -786,7 +787,7 @@ void grpc_resource_user_alloc(grpc_exec_ctx *exec_ctx,
786
787
  gpr_mu_lock(&resource_user->mu);
787
788
  ru_ref_by(resource_user, (gpr_atm)size);
788
789
  resource_user->free_pool -= (int64_t)size;
789
- if (grpc_resource_quota_trace) {
790
+ if (GRPC_TRACER_ON(grpc_resource_quota_trace)) {
790
791
  gpr_log(GPR_DEBUG, "RQ %s %s: alloc %" PRIdPTR "; free_pool -> %" PRId64,
791
792
  resource_user->resource_quota->name, resource_user->name, size,
792
793
  resource_user->free_pool);
@@ -810,7 +811,7 @@ void grpc_resource_user_free(grpc_exec_ctx *exec_ctx,
810
811
  gpr_mu_lock(&resource_user->mu);
811
812
  bool was_zero_or_negative = resource_user->free_pool <= 0;
812
813
  resource_user->free_pool += (int64_t)size;
813
- if (grpc_resource_quota_trace) {
814
+ if (GRPC_TRACER_ON(grpc_resource_quota_trace)) {
814
815
  gpr_log(GPR_DEBUG, "RQ %s %s: free %" PRIdPTR "; free_pool -> %" PRId64,
815
816
  resource_user->resource_quota->name, resource_user->name, size,
816
817
  resource_user->free_pool);
@@ -839,7 +840,7 @@ void grpc_resource_user_post_reclaimer(grpc_exec_ctx *exec_ctx,
839
840
 
840
841
  void grpc_resource_user_finish_reclamation(grpc_exec_ctx *exec_ctx,
841
842
  grpc_resource_user *resource_user) {
842
- if (grpc_resource_quota_trace) {
843
+ if (GRPC_TRACER_ON(grpc_resource_quota_trace)) {
843
844
  gpr_log(GPR_DEBUG, "RQ %s %s: reclamation complete",
844
845
  resource_user->resource_quota->name, resource_user->name);
845
846
  }
@@ -36,6 +36,7 @@
36
36
 
37
37
  #include <grpc/grpc.h>
38
38
 
39
+ #include "src/core/lib/debug/trace.h"
39
40
  #include "src/core/lib/iomgr/exec_ctx.h"
40
41
 
41
42
  /** \file Tracks resource usage against a pool.
@@ -75,7 +76,7 @@
75
76
  maintain lists of users (which users arrange to leave before they are
76
77
  destroyed) */
77
78
 
78
- extern int grpc_resource_quota_trace;
79
+ extern grpc_tracer_flag grpc_resource_quota_trace;
79
80
 
80
81
  grpc_resource_quota *grpc_resource_quota_ref_internal(
81
82
  grpc_resource_quota *resource_quota);
@@ -50,7 +50,7 @@ int grpc_sockaddr_to_v4mapped(const grpc_resolved_address *addr,
50
50
  grpc_resolved_address *addr6_out);
51
51
 
52
52
  /* If addr is ::, 0.0.0.0, or ::ffff:0.0.0.0, writes the port number to
53
- *port_out (if not NULL) and returns true, otherwise returns false. */
53
+ *port_out (if not NULL) and returns true, otherwise returns false. */
54
54
  int grpc_sockaddr_is_wildcard(const grpc_resolved_address *addr, int *port_out);
55
55
 
56
56
  /* Writes 0.0.0.0:port and [::]:port to separate sockaddrs. */
@@ -37,6 +37,8 @@
37
37
  #include <grpc/impl/codegen/grpc_types.h>
38
38
  #include <grpc/support/sync.h>
39
39
 
40
+ #include <stdbool.h>
41
+
40
42
  #ifdef __cplusplus
41
43
  extern "C" {
42
44
  #endif
@@ -0,0 +1,43 @@
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_LIB_IOMGR_SYS_EPOLL_WRAPPER_H
35
+ #define GRPC_CORE_LIB_IOMGR_SYS_EPOLL_WRAPPER_H
36
+
37
+ #include <sys/epoll.h>
38
+
39
+ #ifndef EPOLLEXCLUSIVE
40
+ #define EPOLLEXCLUSIVE (1 << 28)
41
+ #endif
42
+
43
+ #endif /* GRPC_CORE_LIB_IOMGR_SYS_EPOLL_WRAPPER_H */