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.
- checksums.yaml +4 -4
- data/Makefile +418 -126
- data/include/grpc/grpc.h +15 -69
- data/include/grpc/grpc_security.h +1 -1
- data/include/grpc/impl/codegen/compression_types.h +3 -4
- data/include/grpc/impl/codegen/gpr_types.h +0 -1
- data/include/grpc/impl/codegen/grpc_types.h +69 -3
- data/include/grpc/impl/codegen/port_platform.h +6 -0
- data/include/grpc/impl/codegen/slice.h +2 -1
- data/include/grpc/load_reporting.h +6 -6
- data/include/grpc/slice.h +25 -3
- data/include/grpc/slice_buffer.h +4 -0
- data/src/core/ext/census/context.c +1 -1
- data/src/core/ext/census/resource.c +3 -1
- data/src/core/ext/filters/client_channel/channel_connectivity.c +1 -1
- data/src/core/ext/filters/client_channel/client_channel.c +158 -100
- data/src/core/ext/filters/client_channel/client_channel_plugin.c +3 -2
- data/src/core/ext/filters/client_channel/lb_policy.c +2 -1
- data/src/core/ext/filters/client_channel/lb_policy.h +5 -6
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.c +153 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.h +42 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.c +344 -88
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.c +133 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +65 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.c +47 -5
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +6 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.c +19 -8
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/proto/grpc/lb/v1/load_balancer.pb.h +63 -34
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.c +2 -1
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.c +13 -12
- data/src/core/ext/filters/client_channel/lb_policy_factory.c +28 -5
- data/src/core/ext/filters/client_channel/lb_policy_factory.h +18 -4
- data/src/core/ext/filters/client_channel/parse_address.c +37 -7
- data/src/core/ext/filters/client_channel/parse_address.h +11 -8
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.c +3 -3
- data/src/core/ext/filters/client_channel/subchannel.c +19 -16
- data/src/core/ext/filters/client_channel/subchannel.h +1 -0
- data/src/core/ext/filters/client_channel/uri_parser.c +36 -22
- data/src/core/ext/filters/client_channel/uri_parser.h +1 -1
- data/src/core/{lib/channel → ext/filters/deadline}/deadline_filter.c +42 -17
- data/src/core/{lib/channel → ext/filters/deadline}/deadline_filter.h +8 -9
- data/src/core/{lib/channel → ext/filters/http/client}/http_client_filter.c +19 -11
- data/src/core/{lib/channel → ext/filters/http/client}/http_client_filter.h +3 -6
- data/src/core/ext/filters/http/http_filters_plugin.c +104 -0
- data/src/core/{lib/channel/compress_filter.c → ext/filters/http/message_compress/message_compress_filter.c} +124 -23
- data/src/core/{lib/channel/compress_filter.h → ext/filters/http/message_compress/message_compress_filter.h} +5 -6
- data/src/core/{lib/channel → ext/filters/http/server}/http_server_filter.c +4 -6
- data/src/core/{lib/channel → ext/filters/http/server}/http_server_filter.h +3 -3
- data/src/core/ext/filters/load_reporting/load_reporting.c +2 -25
- data/src/core/ext/filters/load_reporting/load_reporting_filter.c +26 -1
- data/src/core/ext/filters/max_age/max_age_filter.c +14 -14
- data/src/core/{lib/channel → ext/filters/message_size}/message_size_filter.c +91 -47
- data/src/core/{lib/channel → ext/filters/message_size}/message_size_filter.h +3 -3
- data/src/core/ext/transport/chttp2/client/insecure/channel_create.c +1 -1
- data/src/core/ext/transport/chttp2/server/chttp2_server.c +2 -2
- data/src/core/ext/transport/chttp2/transport/bin_decoder.c +2 -2
- data/src/core/ext/transport/chttp2/transport/bin_encoder.c +3 -3
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.c +296 -172
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.h +3 -2
- data/src/core/ext/transport/chttp2/transport/frame_data.c +203 -164
- data/src/core/ext/transport/chttp2/transport/frame_data.h +8 -14
- data/src/core/ext/transport/chttp2/transport/frame_goaway.c +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_ping.c +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_rst_stream.c +1 -1
- data/src/core/ext/transport/chttp2/transport/frame_settings.c +5 -5
- data/src/core/ext/transport/chttp2/transport/frame_window_update.c +1 -1
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.c +4 -4
- data/src/core/ext/transport/chttp2/transport/hpack_parser.c +2 -4
- data/src/core/ext/transport/chttp2/transport/hpack_table.c +4 -3
- data/src/core/ext/transport/chttp2/transport/internal.h +50 -33
- data/src/core/ext/transport/chttp2/transport/parsing.c +10 -11
- data/src/core/ext/transport/chttp2/transport/writing.c +32 -13
- data/src/core/lib/channel/channel_args.c +28 -9
- data/src/core/lib/channel/channel_args.h +5 -1
- data/src/core/lib/channel/channel_stack.c +1 -1
- data/src/core/lib/channel/channel_stack.h +2 -2
- data/src/core/lib/channel/channel_stack_builder.c +13 -1
- data/src/core/lib/channel/channel_stack_builder.h +5 -1
- data/src/core/lib/channel/connected_channel.c +3 -1
- data/src/core/lib/channel/context.h +2 -2
- data/src/core/lib/compression/message_compress.c +2 -2
- data/src/core/lib/debug/trace.c +13 -6
- data/src/core/lib/debug/trace.h +27 -1
- data/src/core/lib/http/httpcli.c +1 -1
- data/src/core/lib/http/httpcli_security_connector.c +6 -10
- data/src/core/lib/http/parser.c +2 -2
- data/src/core/lib/http/parser.h +2 -1
- data/src/core/lib/iomgr/combiner.c +6 -6
- data/src/core/lib/iomgr/combiner.h +2 -1
- data/src/core/lib/iomgr/error.c +12 -5
- data/src/core/lib/iomgr/error.h +13 -13
- data/src/core/lib/iomgr/ev_epoll1_linux.c +984 -0
- data/src/core/lib/iomgr/ev_epoll1_linux.h +44 -0
- data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.c +2146 -0
- data/src/core/lib/iomgr/ev_epoll_limited_pollers_linux.h +43 -0
- data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.c +1337 -0
- data/src/core/lib/iomgr/ev_epoll_thread_pool_linux.h +43 -0
- data/src/core/lib/iomgr/ev_epollex_linux.c +1511 -0
- data/src/core/lib/iomgr/ev_epollex_linux.h +43 -0
- data/src/core/lib/iomgr/{ev_epoll_linux.c → ev_epollsig_linux.c} +24 -31
- data/src/core/lib/iomgr/{ev_epoll_linux.h → ev_epollsig_linux.h} +4 -4
- data/src/core/lib/iomgr/ev_poll_posix.c +12 -27
- data/src/core/lib/iomgr/ev_poll_posix.h +2 -2
- data/src/core/lib/iomgr/ev_posix.c +22 -8
- data/src/core/lib/iomgr/ev_posix.h +4 -3
- data/src/core/lib/iomgr/exec_ctx.c +5 -0
- data/src/core/lib/iomgr/exec_ctx.h +2 -0
- data/src/core/lib/iomgr/iomgr.c +4 -0
- data/src/core/lib/iomgr/iomgr.h +3 -0
- data/src/core/lib/iomgr/is_epollexclusive_available.c +116 -0
- data/src/core/lib/iomgr/is_epollexclusive_available.h +41 -0
- data/src/core/lib/iomgr/lockfree_event.c +16 -0
- data/src/core/lib/iomgr/pollset.h +2 -5
- data/src/core/lib/iomgr/pollset_uv.c +1 -1
- data/src/core/lib/iomgr/pollset_windows.c +3 -3
- data/src/core/lib/iomgr/resource_quota.c +9 -8
- data/src/core/lib/iomgr/resource_quota.h +2 -1
- data/src/core/lib/iomgr/sockaddr_utils.h +1 -1
- data/src/core/lib/iomgr/socket_mutator.h +2 -0
- data/src/core/lib/iomgr/sys_epoll_wrapper.h +43 -0
- data/src/core/lib/iomgr/tcp_client_posix.c +6 -6
- data/src/core/lib/iomgr/tcp_client_uv.c +3 -3
- data/src/core/lib/iomgr/tcp_posix.c +7 -7
- data/src/core/lib/iomgr/tcp_posix.h +2 -1
- data/src/core/lib/iomgr/tcp_server_posix.c +1 -1
- data/src/core/lib/iomgr/tcp_uv.c +6 -6
- data/src/core/lib/iomgr/tcp_uv.h +2 -1
- data/src/core/lib/iomgr/tcp_windows.c +1 -1
- data/src/core/lib/iomgr/timer_generic.c +24 -25
- data/src/core/lib/iomgr/timer_manager.c +276 -0
- data/src/core/lib/iomgr/timer_manager.h +52 -0
- data/src/core/lib/iomgr/timer_uv.c +6 -0
- data/src/core/lib/iomgr/udp_server.c +42 -9
- data/src/core/lib/iomgr/udp_server.h +3 -1
- data/src/core/lib/security/credentials/credentials.c +0 -1
- data/src/core/lib/security/credentials/fake/fake_credentials.c +23 -0
- data/src/core/lib/security/credentials/fake/fake_credentials.h +12 -9
- data/src/core/lib/security/credentials/google_default/google_default_credentials.c +1 -1
- data/src/core/lib/security/credentials/jwt/jwt_credentials.c +1 -1
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.c +1 -1
- data/src/core/lib/security/credentials/ssl/ssl_credentials.c +24 -53
- data/src/core/lib/security/transport/client_auth_filter.c +9 -3
- data/src/core/lib/security/transport/secure_endpoint.c +7 -7
- data/src/core/lib/security/transport/secure_endpoint.h +1 -1
- data/src/core/lib/security/transport/security_connector.c +32 -51
- data/src/core/lib/security/transport/security_connector.h +10 -14
- data/src/core/lib/slice/b64.c +1 -1
- data/src/core/lib/slice/percent_encoding.c +3 -3
- data/src/core/lib/slice/slice.c +66 -33
- data/src/core/lib/slice/slice_buffer.c +25 -6
- data/src/core/lib/slice/slice_hash_table.c +33 -35
- data/src/core/lib/slice/slice_hash_table.h +7 -12
- data/src/core/lib/support/atomic.h +45 -0
- data/src/core/lib/support/atomic_with_atm.h +70 -0
- data/src/core/lib/support/atomic_with_std.h +48 -0
- data/src/core/lib/support/avl.c +14 -14
- data/src/core/lib/support/memory.h +74 -0
- data/src/core/lib/support/mpscq.c +12 -1
- data/src/core/lib/support/mpscq.h +4 -0
- data/src/core/lib/support/stack_lockfree.c +3 -36
- data/src/core/lib/support/time_posix.c +8 -0
- data/src/core/lib/support/tmpfile_posix.c +10 -10
- data/src/core/lib/surface/alarm.c +3 -1
- data/src/core/lib/surface/api_trace.c +2 -1
- data/src/core/lib/surface/api_trace.h +2 -2
- data/src/core/lib/surface/byte_buffer_reader.c +1 -1
- data/src/core/lib/surface/call.c +65 -22
- data/src/core/lib/surface/call.h +4 -2
- data/src/core/lib/surface/channel_init.c +2 -19
- data/src/core/lib/surface/channel_stack_type.c +18 -0
- data/src/core/lib/surface/channel_stack_type.h +2 -0
- data/src/core/lib/surface/completion_queue.c +249 -83
- data/src/core/lib/surface/completion_queue.h +18 -13
- data/src/core/lib/surface/completion_queue_factory.c +24 -9
- data/src/core/lib/surface/init.c +1 -52
- data/src/core/lib/surface/{lame_client.c → lame_client.cc} +37 -26
- data/src/core/lib/surface/server.c +50 -27
- data/src/core/lib/surface/server.h +2 -1
- data/src/core/lib/surface/version.c +2 -2
- data/src/core/lib/transport/bdp_estimator.c +20 -9
- data/src/core/lib/transport/bdp_estimator.h +5 -1
- data/src/core/lib/transport/byte_stream.c +23 -9
- data/src/core/lib/transport/byte_stream.h +15 -6
- data/src/core/lib/transport/connectivity_state.c +6 -6
- data/src/core/lib/transport/connectivity_state.h +2 -1
- data/src/core/lib/transport/service_config.c +6 -13
- data/src/core/lib/transport/service_config.h +2 -2
- data/src/core/lib/transport/static_metadata.c +403 -389
- data/src/core/lib/transport/static_metadata.h +127 -114
- data/src/core/plugin_registry/grpc_plugin_registry.c +12 -0
- data/src/core/tsi/fake_transport_security.c +5 -4
- data/src/core/tsi/ssl_transport_security.c +71 -82
- data/src/core/tsi/ssl_transport_security.h +39 -61
- data/src/core/tsi/transport_security.c +83 -2
- data/src/core/tsi/transport_security.h +27 -2
- data/src/core/tsi/transport_security_adapter.c +236 -0
- data/src/core/tsi/transport_security_adapter.h +62 -0
- data/src/core/tsi/transport_security_interface.h +179 -66
- data/src/ruby/ext/grpc/extconf.rb +2 -1
- data/src/ruby/ext/grpc/rb_byte_buffer.c +8 -6
- data/src/ruby/ext/grpc/rb_call.c +56 -48
- data/src/ruby/ext/grpc/rb_call.h +3 -4
- data/src/ruby/ext/grpc/rb_call_credentials.c +23 -22
- data/src/ruby/ext/grpc/rb_channel.c +45 -29
- data/src/ruby/ext/grpc/rb_channel_args.c +11 -9
- data/src/ruby/ext/grpc/rb_channel_credentials.c +16 -12
- data/src/ruby/ext/grpc/rb_completion_queue.c +7 -9
- data/src/ruby/ext/grpc/rb_compression_options.c +7 -6
- data/src/ruby/ext/grpc/rb_event_thread.c +10 -12
- data/src/ruby/ext/grpc/rb_event_thread.h +1 -2
- data/src/ruby/ext/grpc/rb_grpc.c +11 -15
- data/src/ruby/ext/grpc/rb_grpc.h +2 -2
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.c +14 -6
- data/src/ruby/ext/grpc/rb_grpc_imports.generated.h +22 -10
- data/src/ruby/ext/grpc/rb_server.c +26 -28
- data/src/ruby/lib/grpc/version.rb +1 -1
- metadata +40 -18
- data/src/ruby/lib/grpc/grpc_c.bundle +0 -0
- 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. */
|
data/src/core/lib/iomgr/iomgr.c
CHANGED
@@ -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);
|
data/src/core/lib/iomgr/iomgr.h
CHANGED
@@ -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
|
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
|
-
|
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 &&
|
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
|
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
|
-
|
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. */
|
@@ -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 */
|