grpc 1.12.0 → 1.13.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of grpc might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Makefile +314 -23
- data/include/grpc/impl/codegen/fork.h +4 -4
- data/include/grpc/impl/codegen/grpc_types.h +1 -1
- data/include/grpc/impl/codegen/port_platform.h +3 -0
- data/src/boringssl/err_data.c +256 -246
- data/src/core/ext/filters/client_channel/channel_connectivity.cc +1 -1
- data/src/core/ext/filters/client_channel/client_channel.cc +367 -272
- data/src/core/ext/filters/client_channel/lb_policy.h +1 -3
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +11 -9
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +42 -32
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.h +36 -0
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.cc +36 -102
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb_client_stats.h +37 -32
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.cc +22 -19
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/load_balancer_api.h +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +1 -1
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver.h +1 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/dns_resolver_ares.cc +3 -3
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_ev_driver_posix.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +0 -1
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +4 -4
- data/src/core/ext/filters/client_channel/subchannel.cc +3 -3
- data/src/core/ext/filters/http/client_authority_filter.cc +5 -4
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +4 -4
- data/src/core/ext/filters/http/server/http_server_filter.cc +123 -131
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/bin_decoder.cc +9 -8
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +19 -19
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +10 -6
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.h +4 -3
- data/src/core/ext/transport/chttp2/transport/parsing.cc +14 -12
- data/src/core/ext/transport/chttp2/transport/writing.cc +6 -6
- data/src/core/lib/channel/channel_stack.cc +0 -5
- data/src/core/lib/channel/channel_stack.h +1 -1
- data/src/core/lib/channel/channel_stack_builder.cc +0 -3
- data/src/core/lib/channel/channel_stack_builder.h +0 -2
- data/src/core/lib/channel/channel_trace.cc +3 -3
- data/src/core/lib/channel/channelz_registry.cc +77 -0
- data/src/core/lib/channel/channelz_registry.h +99 -0
- data/src/core/lib/channel/handshaker.cc +20 -1
- data/src/core/lib/debug/stats.h +7 -0
- data/src/core/lib/debug/stats_data.cc +5 -0
- data/src/core/lib/debug/stats_data.h +120 -0
- data/src/core/lib/debug/trace.h +11 -9
- data/src/core/lib/gprpp/fork.cc +260 -0
- data/src/core/lib/gprpp/fork.h +79 -0
- data/src/core/lib/gprpp/memory.h +12 -0
- data/src/core/lib/gprpp/orphanable.h +2 -6
- data/src/core/lib/gprpp/ref_counted.h +2 -6
- data/src/core/lib/gprpp/thd.h +0 -3
- data/src/core/lib/gprpp/thd_posix.cc +4 -53
- data/src/core/lib/gprpp/thd_windows.cc +0 -7
- data/src/core/lib/http/httpcli_security_connector.cc +1 -3
- data/src/core/lib/iomgr/combiner.cc +19 -2
- data/src/core/lib/iomgr/combiner.h +1 -1
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +2 -2
- data/src/core/lib/iomgr/ev_epollex_linux.cc +59 -3
- data/src/core/lib/iomgr/ev_epollsig_linux.cc +1 -1
- data/src/core/lib/iomgr/ev_poll_posix.cc +2 -2
- data/src/core/lib/iomgr/ev_posix.cc +11 -4
- data/src/core/lib/iomgr/ev_posix.h +6 -0
- data/src/core/lib/iomgr/exec_ctx.cc +9 -9
- data/src/core/lib/iomgr/exec_ctx.h +39 -20
- data/src/core/lib/iomgr/fork_posix.cc +30 -18
- data/src/core/lib/iomgr/iomgr_posix.cc +2 -2
- data/src/core/lib/iomgr/polling_entity.cc +11 -2
- data/src/core/lib/iomgr/pollset_custom.cc +2 -2
- data/src/core/lib/iomgr/port.h +38 -1
- data/src/core/lib/iomgr/resolve_address.h +1 -1
- data/src/core/lib/iomgr/resolve_address_posix.cc +1 -1
- data/src/core/lib/iomgr/resource_quota.cc +1 -1
- data/src/core/lib/iomgr/sockaddr_posix.h +1 -1
- data/src/core/lib/iomgr/socket_factory_posix.cc +1 -1
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +1 -1
- data/src/core/lib/iomgr/tcp_client_custom.cc +3 -3
- data/src/core/lib/iomgr/tcp_client_posix.cc +3 -2
- data/src/core/lib/iomgr/tcp_custom.cc +1 -1
- data/src/core/lib/iomgr/tcp_posix.cc +18 -10
- data/src/core/lib/iomgr/tcp_server_posix.cc +9 -8
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +1 -1
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +16 -4
- data/src/core/lib/iomgr/timer.h +1 -1
- data/src/core/lib/iomgr/timer_generic.cc +113 -41
- data/src/core/lib/iomgr/timer_manager.cc +1 -1
- data/src/core/lib/security/credentials/credentials.h +1 -0
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +88 -115
- data/src/core/lib/security/credentials/google_default/google_default_credentials.h +16 -0
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +10 -6
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.h +1 -1
- data/src/core/lib/security/security_connector/alts_security_connector.cc +2 -1
- data/src/core/lib/security/security_connector/security_connector.cc +7 -7
- data/src/core/lib/security/transport/security_handshaker.cc +1 -0
- data/src/core/lib/security/util/json_util.cc +4 -0
- data/src/core/lib/slice/slice_buffer.cc +15 -3
- data/src/core/lib/surface/call.cc +31 -17
- data/src/core/lib/surface/call.h +5 -0
- data/src/core/lib/surface/channel.cc +2 -5
- data/src/core/lib/surface/completion_queue.cc +1 -3
- data/src/core/lib/surface/completion_queue.h +0 -1
- data/src/core/lib/surface/init.cc +7 -8
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/byte_stream.cc +1 -1
- data/src/core/lib/transport/transport.cc +2 -1
- data/src/core/lib/transport/transport.h +4 -8
- data/src/core/lib/transport/transport_op_string.cc +1 -1
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.cc +19 -7
- data/src/core/tsi/alts/handshaker/alts_handshaker_client.h +10 -0
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc +28 -2
- data/src/core/tsi/alts/handshaker/alts_tsi_handshaker_private.h +3 -0
- data/src/core/tsi/fake_transport_security.cc +1 -0
- data/src/core/tsi/ssl_transport_security.cc +238 -110
- data/src/core/tsi/transport_security.cc +14 -0
- data/src/core/tsi/transport_security.h +2 -0
- data/src/core/tsi/transport_security_interface.h +11 -1
- data/src/ruby/bin/math_client.rb +17 -9
- data/src/ruby/lib/grpc/generic/rpc_server.rb +2 -1
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/pb/grpc/health/v1/health_services_pb.rb +4 -1
- data/third_party/boringssl/crypto/asn1/a_int.c +33 -28
- data/third_party/boringssl/crypto/asn1/a_mbstr.c +24 -22
- data/third_party/boringssl/crypto/asn1/a_utf8.c +13 -11
- data/third_party/boringssl/crypto/asn1/asn1_locl.h +3 -0
- data/third_party/boringssl/crypto/bio/fd.c +1 -0
- data/third_party/boringssl/crypto/bio/file.c +2 -0
- data/third_party/boringssl/crypto/bn_extra/convert.c +6 -5
- data/third_party/boringssl/crypto/bytestring/ber.c +1 -4
- data/third_party/boringssl/crypto/bytestring/cbb.c +116 -16
- data/third_party/boringssl/crypto/bytestring/cbs.c +150 -20
- data/third_party/boringssl/crypto/cipher_extra/e_aesccm.c +171 -0
- data/third_party/boringssl/crypto/cipher_extra/e_rc2.c +2 -0
- data/third_party/boringssl/crypto/cipher_extra/e_tls.c +1 -2
- data/third_party/boringssl/crypto/cpu-aarch64-fuchsia.c +55 -0
- data/third_party/boringssl/crypto/cpu-aarch64-linux.c +2 -1
- data/third_party/boringssl/crypto/dsa/dsa.c +16 -54
- data/third_party/boringssl/crypto/fipsmodule/bcm.c +11 -542
- data/third_party/boringssl/crypto/fipsmodule/bn/add.c +33 -64
- data/third_party/boringssl/crypto/fipsmodule/bn/asm/x86_64-gcc.c +4 -3
- data/third_party/boringssl/crypto/fipsmodule/bn/bn.c +122 -70
- data/third_party/boringssl/crypto/fipsmodule/bn/bytes.c +32 -71
- data/third_party/boringssl/crypto/fipsmodule/bn/cmp.c +58 -112
- data/third_party/boringssl/crypto/fipsmodule/bn/div.c +198 -122
- data/third_party/boringssl/crypto/fipsmodule/bn/exponentiation.c +31 -65
- data/third_party/boringssl/crypto/fipsmodule/bn/generic.c +2 -1
- data/third_party/boringssl/crypto/fipsmodule/bn/internal.h +98 -15
- data/third_party/boringssl/crypto/fipsmodule/bn/jacobi.c +1 -1
- data/third_party/boringssl/crypto/fipsmodule/bn/montgomery.c +124 -81
- data/third_party/boringssl/crypto/fipsmodule/bn/montgomery_inv.c +8 -30
- data/third_party/boringssl/crypto/fipsmodule/bn/mul.c +303 -347
- data/third_party/boringssl/crypto/fipsmodule/bn/prime.c +2 -3
- data/third_party/boringssl/crypto/fipsmodule/bn/random.c +3 -4
- data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.c +199 -222
- data/third_party/boringssl/crypto/fipsmodule/bn/rsaz_exp.h +27 -47
- data/third_party/boringssl/crypto/fipsmodule/bn/shift.c +45 -28
- data/third_party/boringssl/crypto/fipsmodule/bn/sqrt.c +1 -1
- data/third_party/boringssl/crypto/fipsmodule/cipher/e_aes.c +10 -10
- data/third_party/boringssl/crypto/fipsmodule/des/internal.h +2 -0
- data/third_party/boringssl/crypto/fipsmodule/ec/ec.c +78 -47
- data/third_party/boringssl/crypto/fipsmodule/ec/ec_key.c +35 -54
- data/third_party/boringssl/crypto/fipsmodule/ec/ec_montgomery.c +3 -10
- data/third_party/boringssl/crypto/fipsmodule/ec/internal.h +36 -22
- data/third_party/boringssl/crypto/fipsmodule/ec/oct.c +59 -90
- data/third_party/boringssl/crypto/fipsmodule/ec/p224-64.c +29 -48
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.c +17 -26
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-x86_64.h +15 -11
- data/third_party/boringssl/crypto/fipsmodule/ec/simple.c +45 -51
- data/third_party/boringssl/crypto/fipsmodule/ec/{util-64.c → util.c} +0 -5
- data/third_party/boringssl/crypto/fipsmodule/ec/wnaf.c +144 -264
- data/third_party/boringssl/crypto/fipsmodule/ecdsa/ecdsa.c +78 -56
- data/third_party/boringssl/crypto/fipsmodule/modes/ccm.c +256 -0
- data/third_party/boringssl/crypto/fipsmodule/modes/internal.h +36 -32
- data/third_party/boringssl/crypto/fipsmodule/rand/ctrdrbg.c +9 -7
- data/third_party/boringssl/crypto/fipsmodule/rsa/rsa.c +16 -10
- data/third_party/boringssl/crypto/fipsmodule/rsa/rsa_impl.c +255 -102
- data/third_party/boringssl/crypto/fipsmodule/self_check/self_check.c +581 -0
- data/third_party/boringssl/crypto/fipsmodule/tls/internal.h +39 -0
- data/third_party/boringssl/crypto/fipsmodule/tls/kdf.c +165 -0
- data/third_party/boringssl/crypto/internal.h +65 -2
- data/third_party/boringssl/crypto/mem.c +0 -2
- data/third_party/boringssl/crypto/obj/obj.c +6 -73
- data/third_party/boringssl/crypto/thread_pthread.c +35 -5
- data/third_party/boringssl/crypto/x509/a_strex.c +11 -11
- data/third_party/boringssl/crypto/x509/x_name.c +13 -0
- data/third_party/boringssl/include/openssl/aead.h +4 -0
- data/third_party/boringssl/include/openssl/asn1.h +1 -3
- data/third_party/boringssl/include/openssl/base.h +1 -14
- data/third_party/boringssl/include/openssl/bio.h +1 -1
- data/third_party/boringssl/include/openssl/bn.h +49 -15
- data/third_party/boringssl/include/openssl/bytestring.h +49 -24
- data/third_party/boringssl/include/openssl/crypto.h +4 -0
- data/third_party/boringssl/include/openssl/ec_key.h +7 -3
- data/third_party/boringssl/include/openssl/err.h +9 -9
- data/third_party/boringssl/include/openssl/evp.h +1 -1
- data/third_party/boringssl/include/openssl/rsa.h +34 -10
- data/third_party/boringssl/include/openssl/ssl.h +160 -17
- data/third_party/boringssl/include/openssl/stack.h +1 -1
- data/third_party/boringssl/include/openssl/tls1.h +10 -2
- data/third_party/boringssl/include/openssl/x509.h +3 -0
- data/third_party/boringssl/ssl/d1_both.cc +16 -2
- data/third_party/boringssl/ssl/dtls_method.cc +1 -1
- data/third_party/boringssl/ssl/handoff.cc +285 -0
- data/third_party/boringssl/ssl/handshake.cc +26 -12
- data/third_party/boringssl/ssl/handshake_client.cc +65 -31
- data/third_party/boringssl/ssl/handshake_server.cc +14 -2
- data/third_party/boringssl/ssl/internal.h +132 -79
- data/third_party/boringssl/ssl/s3_both.cc +2 -2
- data/third_party/boringssl/ssl/s3_lib.cc +3 -1
- data/third_party/boringssl/ssl/s3_pkt.cc +0 -18
- data/third_party/boringssl/ssl/ssl_aead_ctx.cc +1 -4
- data/third_party/boringssl/ssl/ssl_asn1.cc +47 -43
- data/third_party/boringssl/ssl/ssl_cipher.cc +8 -8
- data/third_party/boringssl/ssl/ssl_key_share.cc +3 -1
- data/third_party/boringssl/ssl/ssl_lib.cc +83 -14
- data/third_party/boringssl/ssl/ssl_privkey.cc +6 -0
- data/third_party/boringssl/ssl/ssl_stat.cc +6 -6
- data/third_party/boringssl/ssl/ssl_versions.cc +12 -85
- data/third_party/boringssl/ssl/ssl_x509.cc +59 -61
- data/third_party/boringssl/ssl/t1_enc.cc +73 -124
- data/third_party/boringssl/ssl/t1_lib.cc +367 -41
- data/third_party/boringssl/ssl/tls13_both.cc +8 -0
- data/third_party/boringssl/ssl/tls13_client.cc +98 -184
- data/third_party/boringssl/ssl/tls13_enc.cc +88 -158
- data/third_party/boringssl/ssl/tls13_server.cc +91 -137
- data/third_party/boringssl/ssl/tls_method.cc +0 -17
- data/third_party/boringssl/ssl/tls_record.cc +1 -10
- data/third_party/boringssl/third_party/fiat/curve25519.c +921 -2753
- data/third_party/boringssl/third_party/fiat/curve25519_tables.h +7880 -0
- data/third_party/boringssl/third_party/fiat/internal.h +32 -20
- data/third_party/boringssl/third_party/fiat/p256.c +1824 -0
- metadata +64 -64
- data/src/core/lib/channel/channel_trace_registry.cc +0 -80
- data/src/core/lib/channel/channel_trace_registry.h +0 -43
- data/src/core/lib/gpr/fork.cc +0 -78
- data/src/core/lib/gpr/fork.h +0 -35
- data/src/core/tsi/transport_security_adapter.cc +0 -235
- data/src/core/tsi/transport_security_adapter.h +0 -41
- data/src/ruby/bin/apis/google/protobuf/empty.rb +0 -29
- data/src/ruby/bin/apis/pubsub_demo.rb +0 -241
- data/src/ruby/bin/apis/tech/pubsub/proto/pubsub.rb +0 -159
- data/src/ruby/bin/apis/tech/pubsub/proto/pubsub_services.rb +0 -88
- data/src/ruby/pb/test/client.rb +0 -764
- data/src/ruby/pb/test/server.rb +0 -252
- data/third_party/boringssl/crypto/curve25519/x25519-x86_64.c +0 -247
- data/third_party/boringssl/crypto/fipsmodule/ec/p256-64.c +0 -1674
@@ -21,47 +21,52 @@
|
|
21
21
|
|
22
22
|
#include <grpc/support/port_platform.h>
|
23
23
|
|
24
|
-
#include <
|
24
|
+
#include <grpc/support/atm.h>
|
25
25
|
|
26
|
-
#include
|
26
|
+
#include "src/core/lib/gprpp/inlined_vector.h"
|
27
|
+
#include "src/core/lib/gprpp/memory.h"
|
28
|
+
#include "src/core/lib/gprpp/ref_counted.h"
|
27
29
|
|
28
|
-
|
30
|
+
namespace grpc_core {
|
29
31
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
32
|
+
class GrpcLbClientStats : public RefCounted<GrpcLbClientStats> {
|
33
|
+
public:
|
34
|
+
struct DropTokenCount {
|
35
|
+
UniquePtr<char> token;
|
36
|
+
int64_t count;
|
34
37
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
} grpc_grpclb_dropped_call_counts;
|
38
|
+
DropTokenCount(UniquePtr<char> token, int64_t count)
|
39
|
+
: token(std::move(token)), count(count) {}
|
40
|
+
};
|
39
41
|
|
40
|
-
|
41
|
-
grpc_grpclb_client_stats* grpc_grpclb_client_stats_ref(
|
42
|
-
grpc_grpclb_client_stats* client_stats);
|
43
|
-
void grpc_grpclb_client_stats_unref(grpc_grpclb_client_stats* client_stats);
|
42
|
+
typedef InlinedVector<DropTokenCount, 10> DroppedCallCounts;
|
44
43
|
|
45
|
-
|
46
|
-
grpc_grpclb_client_stats* client_stats);
|
47
|
-
void grpc_grpclb_client_stats_add_call_finished(
|
48
|
-
bool finished_with_client_failed_to_send, bool finished_known_received,
|
49
|
-
grpc_grpclb_client_stats* client_stats);
|
44
|
+
GrpcLbClientStats() {}
|
50
45
|
|
51
|
-
|
52
|
-
void
|
53
|
-
|
46
|
+
void AddCallStarted();
|
47
|
+
void AddCallFinished(bool finished_with_client_failed_to_send,
|
48
|
+
bool finished_known_received);
|
54
49
|
|
55
|
-
// This method is not thread-safe; caller must synchronize.
|
56
|
-
void
|
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_client_failed_to_send,
|
60
|
-
int64_t* num_calls_finished_known_received,
|
61
|
-
grpc_grpclb_dropped_call_counts** drop_token_counts);
|
50
|
+
// This method is not thread-safe; caller must synchronize.
|
51
|
+
void AddCallDroppedLocked(char* token);
|
62
52
|
|
63
|
-
|
64
|
-
|
53
|
+
// This method is not thread-safe; caller must synchronize.
|
54
|
+
void GetLocked(int64_t* num_calls_started, int64_t* num_calls_finished,
|
55
|
+
int64_t* num_calls_finished_with_client_failed_to_send,
|
56
|
+
int64_t* num_calls_finished_known_received,
|
57
|
+
UniquePtr<DroppedCallCounts>* drop_token_counts);
|
58
|
+
|
59
|
+
private:
|
60
|
+
// This field must only be accessed via *_locked() methods.
|
61
|
+
UniquePtr<DroppedCallCounts> drop_token_counts_;
|
62
|
+
// These fields may be accessed from multiple threads at a time.
|
63
|
+
gpr_atm num_calls_started_ = 0;
|
64
|
+
gpr_atm num_calls_finished_ = 0;
|
65
|
+
gpr_atm num_calls_finished_with_client_failed_to_send_ = 0;
|
66
|
+
gpr_atm num_calls_finished_known_received_ = 0;
|
67
|
+
};
|
68
|
+
|
69
|
+
} // namespace grpc_core
|
65
70
|
|
66
71
|
#endif /* GRPC_CORE_EXT_FILTERS_CLIENT_CHANNEL_LB_POLICY_GRPCLB_GRPCLB_CLIENT_STATS_H \
|
67
72
|
*/
|
@@ -29,7 +29,7 @@ static bool count_serverlist(pb_istream_t* stream, const pb_field_t* field,
|
|
29
29
|
void** arg) {
|
30
30
|
grpc_grpclb_serverlist* sl = static_cast<grpc_grpclb_serverlist*>(*arg);
|
31
31
|
grpc_grpclb_server server;
|
32
|
-
if (!pb_decode(stream, grpc_lb_v1_Server_fields, &server)) {
|
32
|
+
if (GPR_UNLIKELY(!pb_decode(stream, grpc_lb_v1_Server_fields, &server))) {
|
33
33
|
gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(stream));
|
34
34
|
return false;
|
35
35
|
}
|
@@ -52,7 +52,7 @@ static bool decode_serverlist(pb_istream_t* stream, const pb_field_t* field,
|
|
52
52
|
GPR_ASSERT(dec_arg->serverlist->num_servers >= dec_arg->decoding_idx);
|
53
53
|
grpc_grpclb_server* server =
|
54
54
|
static_cast<grpc_grpclb_server*>(gpr_zalloc(sizeof(grpc_grpclb_server)));
|
55
|
-
if (!pb_decode(stream, grpc_lb_v1_Server_fields, server)) {
|
55
|
+
if (GPR_UNLIKELY(!pb_decode(stream, grpc_lb_v1_Server_fields, server))) {
|
56
56
|
gpr_free(server);
|
57
57
|
gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(stream));
|
58
58
|
return false;
|
@@ -89,16 +89,16 @@ static bool encode_string(pb_ostream_t* stream, const pb_field_t* field,
|
|
89
89
|
|
90
90
|
static bool encode_drops(pb_ostream_t* stream, const pb_field_t* field,
|
91
91
|
void* const* arg) {
|
92
|
-
|
93
|
-
static_cast<
|
92
|
+
grpc_core::GrpcLbClientStats::DroppedCallCounts* drop_entries =
|
93
|
+
static_cast<grpc_core::GrpcLbClientStats::DroppedCallCounts*>(*arg);
|
94
94
|
if (drop_entries == nullptr) return true;
|
95
|
-
for (size_t i = 0; i < drop_entries->
|
95
|
+
for (size_t i = 0; i < drop_entries->size(); ++i) {
|
96
96
|
if (!pb_encode_tag_for_field(stream, field)) return false;
|
97
97
|
grpc_lb_v1_ClientStatsPerToken drop_message;
|
98
98
|
drop_message.load_balance_token.funcs.encode = encode_string;
|
99
|
-
drop_message.load_balance_token.arg = drop_entries
|
99
|
+
drop_message.load_balance_token.arg = (*drop_entries)[i].token.get();
|
100
100
|
drop_message.has_num_calls = true;
|
101
|
-
drop_message.num_calls = drop_entries
|
101
|
+
drop_message.num_calls = (*drop_entries)[i].count;
|
102
102
|
if (!pb_encode_submessage(stream, grpc_lb_v1_ClientStatsPerToken_fields,
|
103
103
|
&drop_message)) {
|
104
104
|
return false;
|
@@ -108,7 +108,7 @@ static bool encode_drops(pb_ostream_t* stream, const pb_field_t* field,
|
|
108
108
|
}
|
109
109
|
|
110
110
|
grpc_grpclb_request* grpc_grpclb_load_report_request_create_locked(
|
111
|
-
|
111
|
+
grpc_core::GrpcLbClientStats* client_stats) {
|
112
112
|
grpc_grpclb_request* req = static_cast<grpc_grpclb_request*>(
|
113
113
|
gpr_zalloc(sizeof(grpc_grpclb_request)));
|
114
114
|
req->has_client_stats = true;
|
@@ -120,13 +120,15 @@ grpc_grpclb_request* grpc_grpclb_load_report_request_create_locked(
|
|
120
120
|
req->client_stats.has_num_calls_finished_with_client_failed_to_send = true;
|
121
121
|
req->client_stats.has_num_calls_finished_known_received = true;
|
122
122
|
req->client_stats.calls_finished_with_drop.funcs.encode = encode_drops;
|
123
|
-
|
124
|
-
|
123
|
+
grpc_core::UniquePtr<grpc_core::GrpcLbClientStats::DroppedCallCounts>
|
124
|
+
drop_counts;
|
125
|
+
client_stats->GetLocked(
|
126
|
+
&req->client_stats.num_calls_started,
|
125
127
|
&req->client_stats.num_calls_finished,
|
126
128
|
&req->client_stats.num_calls_finished_with_client_failed_to_send,
|
127
|
-
&req->client_stats.num_calls_finished_known_received,
|
128
|
-
|
129
|
-
|
129
|
+
&req->client_stats.num_calls_finished_known_received, &drop_counts);
|
130
|
+
// Will be deleted in grpc_grpclb_request_destroy().
|
131
|
+
req->client_stats.calls_finished_with_drop.arg = drop_counts.release();
|
130
132
|
return req;
|
131
133
|
}
|
132
134
|
|
@@ -149,10 +151,10 @@ grpc_slice grpc_grpclb_request_encode(const grpc_grpclb_request* request) {
|
|
149
151
|
|
150
152
|
void grpc_grpclb_request_destroy(grpc_grpclb_request* request) {
|
151
153
|
if (request->has_client_stats) {
|
152
|
-
|
153
|
-
static_cast<
|
154
|
+
grpc_core::GrpcLbClientStats::DroppedCallCounts* drop_entries =
|
155
|
+
static_cast<grpc_core::GrpcLbClientStats::DroppedCallCounts*>(
|
154
156
|
request->client_stats.calls_finished_with_drop.arg);
|
155
|
-
|
157
|
+
grpc_core::Delete(drop_entries);
|
156
158
|
}
|
157
159
|
gpr_free(request);
|
158
160
|
}
|
@@ -165,7 +167,8 @@ grpc_grpclb_initial_response* grpc_grpclb_initial_response_parse(
|
|
165
167
|
GRPC_SLICE_LENGTH(encoded_grpc_grpclb_response));
|
166
168
|
grpc_grpclb_response res;
|
167
169
|
memset(&res, 0, sizeof(grpc_grpclb_response));
|
168
|
-
if (
|
170
|
+
if (GPR_UNLIKELY(
|
171
|
+
!pb_decode(&stream, grpc_lb_v1_LoadBalanceResponse_fields, &res))) {
|
169
172
|
gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
|
170
173
|
return nullptr;
|
171
174
|
}
|
@@ -195,7 +198,7 @@ grpc_grpclb_serverlist* grpc_grpclb_response_parse_serverlist(
|
|
195
198
|
res.server_list.servers.funcs.decode = count_serverlist;
|
196
199
|
res.server_list.servers.arg = sl;
|
197
200
|
bool status = pb_decode(&stream, grpc_lb_v1_LoadBalanceResponse_fields, &res);
|
198
|
-
if (!status) {
|
201
|
+
if (GPR_UNLIKELY(!status)) {
|
199
202
|
gpr_free(sl);
|
200
203
|
gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
|
201
204
|
return nullptr;
|
@@ -211,7 +214,7 @@ grpc_grpclb_serverlist* grpc_grpclb_response_parse_serverlist(
|
|
211
214
|
res.server_list.servers.arg = &decode_arg;
|
212
215
|
status = pb_decode(&stream_at_start, grpc_lb_v1_LoadBalanceResponse_fields,
|
213
216
|
&res);
|
214
|
-
if (!status) {
|
217
|
+
if (GPR_UNLIKELY(!status)) {
|
215
218
|
grpc_grpclb_destroy_serverlist(sl);
|
216
219
|
gpr_log(GPR_ERROR, "nanopb error: %s", PB_GET_ERROR(&stream));
|
217
220
|
return nullptr;
|
@@ -42,7 +42,7 @@ typedef struct {
|
|
42
42
|
/** Create a request for a gRPC LB service under \a lb_service_name */
|
43
43
|
grpc_grpclb_request* grpc_grpclb_request_create(const char* lb_service_name);
|
44
44
|
grpc_grpclb_request* grpc_grpclb_load_report_request_create_locked(
|
45
|
-
|
45
|
+
grpc_core::GrpcLbClientStats* client_stats);
|
46
46
|
|
47
47
|
/** Protocol Buffers v3-encode \a request */
|
48
48
|
grpc_slice grpc_grpclb_request_encode(const grpc_grpclb_request* request);
|
@@ -490,7 +490,7 @@ void PickFirst::PickFirstSubchannelData::ProcessConnectivityChangeLocked(
|
|
490
490
|
if (grpc_lb_pick_first_trace.enabled()) {
|
491
491
|
gpr_log(GPR_INFO,
|
492
492
|
"Servicing pending pick with selected subchannel %p",
|
493
|
-
p->selected_);
|
493
|
+
p->selected_->subchannel());
|
494
494
|
}
|
495
495
|
GRPC_CLOSURE_SCHED(pick->on_complete, GRPC_ERROR_NONE);
|
496
496
|
}
|
@@ -608,7 +608,7 @@ void RoundRobin::PingOneLocked(grpc_closure* on_initiate,
|
|
608
608
|
|
609
609
|
void RoundRobin::UpdateLocked(const grpc_channel_args& args) {
|
610
610
|
const grpc_arg* arg = grpc_channel_args_find(&args, GRPC_ARG_LB_ADDRESSES);
|
611
|
-
if (arg == nullptr || arg->type != GRPC_ARG_POINTER) {
|
611
|
+
if (GPR_UNLIKELY(arg == nullptr || arg->type != GRPC_ARG_POINTER)) {
|
612
612
|
gpr_log(GPR_ERROR, "[RR %p] update provided no addresses; ignoring", this);
|
613
613
|
// If we don't have a current subchannel list, go into TRANSIENT_FAILURE.
|
614
614
|
// Otherwise, keep using the current subchannel list (ignore this update).
|
@@ -105,9 +105,7 @@ class Resolver : public InternallyRefCountedWithTracing<Resolver> {
|
|
105
105
|
GRPC_ABSTRACT_BASE_CLASS
|
106
106
|
|
107
107
|
protected:
|
108
|
-
|
109
|
-
template <typename T>
|
110
|
-
friend void Delete(T*);
|
108
|
+
GPRC_ALLOW_CLASS_TO_USE_NON_PUBLIC_DELETE
|
111
109
|
|
112
110
|
/// Does NOT take ownership of the reference to \a combiner.
|
113
111
|
// TODO(roth): Once we have a C++-like interface for combiners, this
|
@@ -346,7 +346,7 @@ void AresDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) {
|
|
346
346
|
RefCountedPtr<Resolver> self = r->Ref(DEBUG_LOCATION, "retry-timer");
|
347
347
|
self.release();
|
348
348
|
if (timeout > 0) {
|
349
|
-
gpr_log(GPR_DEBUG, "retrying in %"
|
349
|
+
gpr_log(GPR_DEBUG, "retrying in %" PRId64 " milliseconds", timeout);
|
350
350
|
} else {
|
351
351
|
gpr_log(GPR_DEBUG, "retrying immediately");
|
352
352
|
}
|
@@ -381,8 +381,8 @@ void AresDnsResolver::MaybeStartResolvingLocked() {
|
|
381
381
|
const grpc_millis last_resolution_ago =
|
382
382
|
grpc_core::ExecCtx::Get()->Now() - last_resolution_timestamp_;
|
383
383
|
gpr_log(GPR_DEBUG,
|
384
|
-
"In cooldown from last resolution (from %"
|
385
|
-
" ms ago). Will resolve again in %"
|
384
|
+
"In cooldown from last resolution (from %" PRId64
|
385
|
+
" ms ago). Will resolve again in %" PRId64 " ms",
|
386
386
|
last_resolution_ago, ms_until_next_resolution);
|
387
387
|
have_next_resolution_timer_ = true;
|
388
388
|
// TODO(roth): We currently deal with this ref manually. Once the
|
@@ -18,7 +18,7 @@
|
|
18
18
|
#include <grpc/support/port_platform.h>
|
19
19
|
|
20
20
|
#include "src/core/lib/iomgr/port.h"
|
21
|
-
#if GRPC_ARES == 1 && defined(
|
21
|
+
#if GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER)
|
22
22
|
|
23
23
|
#include <ares.h>
|
24
24
|
#include <sys/ioctl.h>
|
@@ -348,4 +348,4 @@ void grpc_ares_ev_driver_start(grpc_ares_ev_driver* ev_driver) {
|
|
348
348
|
gpr_mu_unlock(&ev_driver->mu);
|
349
349
|
}
|
350
350
|
|
351
|
-
#endif /* GRPC_ARES == 1 && defined(
|
351
|
+
#endif /* GRPC_ARES == 1 && defined(GRPC_POSIX_SOCKET_ARES_EV_DRIVER) */
|
@@ -270,7 +270,6 @@ static void on_hostbyname_done_cb(void* arg, int status, int timeouts,
|
|
270
270
|
static void on_srv_query_done_cb(void* arg, int status, int timeouts,
|
271
271
|
unsigned char* abuf, int alen) {
|
272
272
|
grpc_ares_request* r = static_cast<grpc_ares_request*>(arg);
|
273
|
-
grpc_core::ExecCtx exec_ctx;
|
274
273
|
gpr_log(GPR_DEBUG, "on_query_srv_done_cb");
|
275
274
|
if (status == ARES_SUCCESS) {
|
276
275
|
gpr_log(GPR_DEBUG, "on_query_srv_done_cb ARES_SUCCESS");
|
@@ -218,7 +218,7 @@ void NativeDnsResolver::OnResolvedLocked(void* arg, grpc_error* error) {
|
|
218
218
|
r->Ref(DEBUG_LOCATION, "next_resolution_timer");
|
219
219
|
self.release();
|
220
220
|
if (timeout > 0) {
|
221
|
-
gpr_log(GPR_DEBUG, "retrying in %"
|
221
|
+
gpr_log(GPR_DEBUG, "retrying in %" PRId64 " milliseconds", timeout);
|
222
222
|
} else {
|
223
223
|
gpr_log(GPR_DEBUG, "retrying immediately");
|
224
224
|
}
|
@@ -254,8 +254,8 @@ void NativeDnsResolver::MaybeStartResolvingLocked() {
|
|
254
254
|
const grpc_millis last_resolution_ago =
|
255
255
|
grpc_core::ExecCtx::Get()->Now() - last_resolution_timestamp_;
|
256
256
|
gpr_log(GPR_DEBUG,
|
257
|
-
"In cooldown from last resolution (from %"
|
258
|
-
" ms ago). Will resolve again in %"
|
257
|
+
"In cooldown from last resolution (from %" PRId64
|
258
|
+
" ms ago). Will resolve again in %" PRId64 " ms",
|
259
259
|
last_resolution_ago, ms_until_next_resolution);
|
260
260
|
have_next_resolution_timer_ = true;
|
261
261
|
// TODO(roth): We currently deal with this ref manually. Once the
|
@@ -310,7 +310,7 @@ class NativeDnsResolverFactory : public ResolverFactory {
|
|
310
310
|
public:
|
311
311
|
OrphanablePtr<Resolver> CreateResolver(
|
312
312
|
const ResolverArgs& args) const override {
|
313
|
-
if (0 != strcmp(args.uri->authority, "")) {
|
313
|
+
if (GPR_UNLIKELY(0 != strcmp(args.uri->authority, ""))) {
|
314
314
|
gpr_log(GPR_ERROR, "authority based dns uri's not supported");
|
315
315
|
return OrphanablePtr<Resolver>(nullptr);
|
316
316
|
}
|
@@ -408,7 +408,7 @@ static void on_external_state_watcher_done(void* arg, grpc_error* error) {
|
|
408
408
|
gpr_mu_unlock(&w->subchannel->mu);
|
409
409
|
GRPC_SUBCHANNEL_WEAK_UNREF(w->subchannel, "external_state_watcher");
|
410
410
|
gpr_free(w);
|
411
|
-
|
411
|
+
GRPC_CLOSURE_SCHED(follow_up, GRPC_ERROR_REF(error));
|
412
412
|
}
|
413
413
|
|
414
414
|
static void on_alarm(void* arg, grpc_error* error) {
|
@@ -467,7 +467,7 @@ static void maybe_start_connecting_locked(grpc_subchannel* c) {
|
|
467
467
|
if (time_til_next <= 0) {
|
468
468
|
gpr_log(GPR_INFO, "Subchannel %p: Retry immediately", c);
|
469
469
|
} else {
|
470
|
-
gpr_log(GPR_INFO, "Subchannel %p: Retry in %"
|
470
|
+
gpr_log(GPR_INFO, "Subchannel %p: Retry in %" PRId64 " milliseconds", c,
|
471
471
|
time_til_next);
|
472
472
|
}
|
473
473
|
GRPC_CLOSURE_INIT(&c->on_alarm, on_alarm, c, grpc_schedule_on_exec_ctx);
|
@@ -803,7 +803,7 @@ grpc_error* ConnectedSubchannel::CreateCall(const CallArgs& args,
|
|
803
803
|
};
|
804
804
|
grpc_error* error = grpc_call_stack_init(
|
805
805
|
channel_stack_, 1, subchannel_call_destroy, *call, &call_args);
|
806
|
-
if (error != GRPC_ERROR_NONE) {
|
806
|
+
if (GPR_UNLIKELY(error != GRPC_ERROR_NONE)) {
|
807
807
|
const char* error_string = grpc_error_string(error);
|
808
808
|
gpr_log(GPR_ERROR, "error: %s", error_string);
|
809
809
|
return error;
|
@@ -59,8 +59,9 @@ void authority_start_transport_stream_op_batch(
|
|
59
59
|
initial_metadata->idx.named.authority == nullptr) {
|
60
60
|
grpc_error* error = grpc_metadata_batch_add_head(
|
61
61
|
initial_metadata, &calld->authority_storage,
|
62
|
-
grpc_mdelem_from_slices(
|
63
|
-
|
62
|
+
grpc_mdelem_from_slices(
|
63
|
+
GRPC_MDSTR_AUTHORITY,
|
64
|
+
grpc_slice_ref_internal(chand->default_authority)));
|
64
65
|
if (error != GRPC_ERROR_NONE) {
|
65
66
|
grpc_transport_stream_op_batch_finish_with_failure(batch, error,
|
66
67
|
calld->call_combiner);
|
@@ -102,7 +103,7 @@ grpc_error* init_channel_elem(grpc_channel_element* elem,
|
|
102
103
|
"GRPC_ARG_DEFAULT_AUTHORITY channel arg. must be a string");
|
103
104
|
}
|
104
105
|
chand->default_authority =
|
105
|
-
|
106
|
+
grpc_slice_intern(grpc_slice_from_static_string(default_authority_str));
|
106
107
|
GPR_ASSERT(!args->is_last);
|
107
108
|
return GRPC_ERROR_NONE;
|
108
109
|
}
|
@@ -110,7 +111,7 @@ grpc_error* init_channel_elem(grpc_channel_element* elem,
|
|
110
111
|
/* Destructor for channel data */
|
111
112
|
void destroy_channel_elem(grpc_channel_element* elem) {
|
112
113
|
channel_data* chand = static_cast<channel_data*>(elem->channel_data);
|
113
|
-
|
114
|
+
grpc_slice_unref_internal(chand->default_authority);
|
114
115
|
}
|
115
116
|
} // namespace
|
116
117
|
|
@@ -116,8 +116,8 @@ static grpc_error* process_send_initial_metadata(
|
|
116
116
|
if (initial_metadata->idx.named.grpc_internal_encoding_request != nullptr) {
|
117
117
|
grpc_mdelem md =
|
118
118
|
initial_metadata->idx.named.grpc_internal_encoding_request->md;
|
119
|
-
if (!grpc_compression_algorithm_parse(
|
120
|
-
|
119
|
+
if (GPR_UNLIKELY(!grpc_compression_algorithm_parse(
|
120
|
+
GRPC_MDVALUE(md), &compression_algorithm))) {
|
121
121
|
char* val = grpc_slice_to_c_string(GRPC_MDVALUE(md));
|
122
122
|
gpr_log(GPR_ERROR,
|
123
123
|
"Invalid compression algorithm: '%s' (unknown). Ignoring.", val);
|
@@ -125,8 +125,8 @@ static grpc_error* process_send_initial_metadata(
|
|
125
125
|
calld->message_compression_algorithm = GRPC_MESSAGE_COMPRESS_NONE;
|
126
126
|
stream_compression_algorithm = GRPC_STREAM_COMPRESS_NONE;
|
127
127
|
}
|
128
|
-
if (!GPR_BITGET(channeld->enabled_algorithms_bitset,
|
129
|
-
|
128
|
+
if (GPR_UNLIKELY(!GPR_BITGET(channeld->enabled_algorithms_bitset,
|
129
|
+
compression_algorithm))) {
|
130
130
|
char* val = grpc_slice_to_c_string(GRPC_MDVALUE(md));
|
131
131
|
gpr_log(GPR_ERROR,
|
132
132
|
"Invalid compression algorithm: '%s' (previously disabled). "
|
@@ -35,43 +35,37 @@
|
|
35
35
|
#define EXPECTED_CONTENT_TYPE_LENGTH sizeof(EXPECTED_CONTENT_TYPE) - 1
|
36
36
|
|
37
37
|
namespace {
|
38
|
+
|
38
39
|
struct call_data {
|
39
40
|
grpc_call_combiner* call_combiner;
|
40
41
|
|
42
|
+
// Outgoing headers to add to send_initial_metadata.
|
41
43
|
grpc_linked_mdelem status;
|
42
44
|
grpc_linked_mdelem content_type;
|
43
45
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
bool
|
46
|
+
// If we see the recv_message contents in the GET query string, we
|
47
|
+
// store it here.
|
48
|
+
grpc_core::ManualConstructor<grpc_core::SliceBufferByteStream> read_stream;
|
49
|
+
bool have_read_stream;
|
48
50
|
|
51
|
+
// State for intercepting recv_initial_metadata.
|
52
|
+
grpc_closure recv_initial_metadata_ready;
|
53
|
+
grpc_closure* original_recv_initial_metadata_ready;
|
49
54
|
grpc_metadata_batch* recv_initial_metadata;
|
50
55
|
uint32_t* recv_initial_metadata_flags;
|
51
|
-
|
52
|
-
grpc_closure* on_done_recv;
|
53
|
-
/** Closure to call when we retrieve read message from the path URI
|
54
|
-
*/
|
55
|
-
grpc_closure* recv_message_ready;
|
56
|
-
grpc_closure* on_complete;
|
57
|
-
grpc_core::OrphanablePtr<grpc_core::ByteStream>* pp_recv_message;
|
58
|
-
grpc_core::ManualConstructor<grpc_core::SliceBufferByteStream> read_stream;
|
56
|
+
bool seen_recv_initial_metadata_ready;
|
59
57
|
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
grpc_closure hs_recv_message_ready;
|
58
|
+
// State for intercepting recv_message.
|
59
|
+
grpc_closure* original_recv_message_ready;
|
60
|
+
grpc_closure recv_message_ready;
|
61
|
+
grpc_core::OrphanablePtr<grpc_core::ByteStream>* recv_message;
|
62
|
+
bool seen_recv_message_ready;
|
66
63
|
};
|
67
64
|
|
68
|
-
struct channel_data {
|
69
|
-
uint8_t unused;
|
70
|
-
};
|
71
65
|
} // namespace
|
72
66
|
|
73
|
-
static grpc_error*
|
74
|
-
|
67
|
+
static grpc_error* hs_filter_outgoing_metadata(grpc_call_element* elem,
|
68
|
+
grpc_metadata_batch* b) {
|
75
69
|
if (b->idx.named.grpc_message != nullptr) {
|
76
70
|
grpc_slice pct_encoded_msg = grpc_percent_encode_slice(
|
77
71
|
GRPC_MDVALUE(b->idx.named.grpc_message->md),
|
@@ -86,8 +80,8 @@ static grpc_error* server_filter_outgoing_metadata(grpc_call_element* elem,
|
|
86
80
|
return GRPC_ERROR_NONE;
|
87
81
|
}
|
88
82
|
|
89
|
-
static void
|
90
|
-
|
83
|
+
static void hs_add_error(const char* error_name, grpc_error** cumulative,
|
84
|
+
grpc_error* new_err) {
|
91
85
|
if (new_err == GRPC_ERROR_NONE) return;
|
92
86
|
if (*cumulative == GRPC_ERROR_NONE) {
|
93
87
|
*cumulative = GRPC_ERROR_CREATE_FROM_COPIED_STRING(error_name);
|
@@ -95,8 +89,8 @@ static void add_error(const char* error_name, grpc_error** cumulative,
|
|
95
89
|
*cumulative = grpc_error_add_child(*cumulative, new_err);
|
96
90
|
}
|
97
91
|
|
98
|
-
static grpc_error*
|
99
|
-
|
92
|
+
static grpc_error* hs_filter_incoming_metadata(grpc_call_element* elem,
|
93
|
+
grpc_metadata_batch* b) {
|
100
94
|
call_data* calld = static_cast<call_data*>(elem->call_data);
|
101
95
|
grpc_error* error = GRPC_ERROR_NONE;
|
102
96
|
static const char* error_name = "Failed processing incoming headers";
|
@@ -119,14 +113,14 @@ static grpc_error* server_filter_incoming_metadata(grpc_call_element* elem,
|
|
119
113
|
*calld->recv_initial_metadata_flags &=
|
120
114
|
~GRPC_INITIAL_METADATA_IDEMPOTENT_REQUEST;
|
121
115
|
} else {
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
116
|
+
hs_add_error(error_name, &error,
|
117
|
+
grpc_attach_md_to_error(
|
118
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Bad header"),
|
119
|
+
b->idx.named.method->md));
|
126
120
|
}
|
127
121
|
grpc_metadata_batch_remove(b, b->idx.named.method);
|
128
122
|
} else {
|
129
|
-
|
123
|
+
hs_add_error(
|
130
124
|
error_name, &error,
|
131
125
|
grpc_error_set_str(
|
132
126
|
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"),
|
@@ -135,31 +129,31 @@ static grpc_error* server_filter_incoming_metadata(grpc_call_element* elem,
|
|
135
129
|
|
136
130
|
if (b->idx.named.te != nullptr) {
|
137
131
|
if (!grpc_mdelem_eq(b->idx.named.te->md, GRPC_MDELEM_TE_TRAILERS)) {
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
132
|
+
hs_add_error(error_name, &error,
|
133
|
+
grpc_attach_md_to_error(
|
134
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Bad header"),
|
135
|
+
b->idx.named.te->md));
|
142
136
|
}
|
143
137
|
grpc_metadata_batch_remove(b, b->idx.named.te);
|
144
138
|
} else {
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
139
|
+
hs_add_error(error_name, &error,
|
140
|
+
grpc_error_set_str(
|
141
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"),
|
142
|
+
GRPC_ERROR_STR_KEY, grpc_slice_from_static_string("te")));
|
149
143
|
}
|
150
144
|
|
151
145
|
if (b->idx.named.scheme != nullptr) {
|
152
146
|
if (!grpc_mdelem_eq(b->idx.named.scheme->md, GRPC_MDELEM_SCHEME_HTTP) &&
|
153
147
|
!grpc_mdelem_eq(b->idx.named.scheme->md, GRPC_MDELEM_SCHEME_HTTPS) &&
|
154
148
|
!grpc_mdelem_eq(b->idx.named.scheme->md, GRPC_MDELEM_SCHEME_GRPC)) {
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
149
|
+
hs_add_error(error_name, &error,
|
150
|
+
grpc_attach_md_to_error(
|
151
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Bad header"),
|
152
|
+
b->idx.named.scheme->md));
|
159
153
|
}
|
160
154
|
grpc_metadata_batch_remove(b, b->idx.named.scheme);
|
161
155
|
} else {
|
162
|
-
|
156
|
+
hs_add_error(
|
163
157
|
error_name, &error,
|
164
158
|
grpc_error_set_str(
|
165
159
|
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"),
|
@@ -196,10 +190,11 @@ static grpc_error* server_filter_incoming_metadata(grpc_call_element* elem,
|
|
196
190
|
}
|
197
191
|
|
198
192
|
if (b->idx.named.path == nullptr) {
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
193
|
+
hs_add_error(
|
194
|
+
error_name, &error,
|
195
|
+
grpc_error_set_str(
|
196
|
+
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"),
|
197
|
+
GRPC_ERROR_STR_KEY, grpc_slice_from_static_string(":path")));
|
203
198
|
} else if (*calld->recv_initial_metadata_flags &
|
204
199
|
GRPC_INITIAL_METADATA_CACHEABLE_REQUEST) {
|
205
200
|
/* We have a cacheable request made with GET verb. The path contains the
|
@@ -235,7 +230,7 @@ static grpc_error* server_filter_incoming_metadata(grpc_call_element* elem,
|
|
235
230
|
GRPC_SLICE_LENGTH(query_slice), k_url_safe));
|
236
231
|
calld->read_stream.Init(&read_slice_buffer, 0);
|
237
232
|
grpc_slice_buffer_destroy_internal(&read_slice_buffer);
|
238
|
-
calld->
|
233
|
+
calld->have_read_stream = true;
|
239
234
|
grpc_slice_unref_internal(query_slice);
|
240
235
|
} else {
|
241
236
|
gpr_log(GPR_ERROR, "GET request without QUERY");
|
@@ -246,17 +241,17 @@ static grpc_error* server_filter_incoming_metadata(grpc_call_element* elem,
|
|
246
241
|
grpc_linked_mdelem* el = b->idx.named.host;
|
247
242
|
grpc_mdelem md = GRPC_MDELEM_REF(el->md);
|
248
243
|
grpc_metadata_batch_remove(b, el);
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
244
|
+
hs_add_error(error_name, &error,
|
245
|
+
grpc_metadata_batch_add_head(
|
246
|
+
b, el,
|
247
|
+
grpc_mdelem_from_slices(
|
248
|
+
GRPC_MDSTR_AUTHORITY,
|
249
|
+
grpc_slice_ref_internal(GRPC_MDVALUE(md)))));
|
255
250
|
GRPC_MDELEM_UNREF(md);
|
256
251
|
}
|
257
252
|
|
258
253
|
if (b->idx.named.authority == nullptr) {
|
259
|
-
|
254
|
+
hs_add_error(
|
260
255
|
error_name, &error,
|
261
256
|
grpc_error_set_str(
|
262
257
|
GRPC_ERROR_CREATE_FROM_STATIC_STRING("Missing header"),
|
@@ -266,49 +261,55 @@ static grpc_error* server_filter_incoming_metadata(grpc_call_element* elem,
|
|
266
261
|
return error;
|
267
262
|
}
|
268
263
|
|
269
|
-
static void
|
264
|
+
static void hs_recv_initial_metadata_ready(void* user_data, grpc_error* err) {
|
270
265
|
grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
|
271
266
|
call_data* calld = static_cast<call_data*>(elem->call_data);
|
267
|
+
calld->seen_recv_initial_metadata_ready = true;
|
272
268
|
if (err == GRPC_ERROR_NONE) {
|
273
|
-
err =
|
269
|
+
err = hs_filter_incoming_metadata(elem, calld->recv_initial_metadata);
|
270
|
+
if (calld->seen_recv_message_ready) {
|
271
|
+
// We've already seen the recv_message callback, but we previously
|
272
|
+
// deferred it, so we need to return it here.
|
273
|
+
// Replace the recv_message byte stream if needed.
|
274
|
+
if (calld->have_read_stream) {
|
275
|
+
calld->recv_message->reset(calld->read_stream.get());
|
276
|
+
calld->have_read_stream = false;
|
277
|
+
}
|
278
|
+
// Re-enter call combiner for original_recv_message_ready, since the
|
279
|
+
// surface code will release the call combiner for each callback it
|
280
|
+
// receives.
|
281
|
+
GRPC_CALL_COMBINER_START(
|
282
|
+
calld->call_combiner, calld->original_recv_message_ready,
|
283
|
+
GRPC_ERROR_REF(err),
|
284
|
+
"resuming recv_message_ready from recv_initial_metadata_ready");
|
285
|
+
}
|
274
286
|
} else {
|
275
287
|
GRPC_ERROR_REF(err);
|
276
288
|
}
|
277
|
-
GRPC_CLOSURE_RUN(calld->
|
278
|
-
}
|
279
|
-
|
280
|
-
static void hs_on_complete(void* user_data, grpc_error* err) {
|
281
|
-
grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
|
282
|
-
call_data* calld = static_cast<call_data*>(elem->call_data);
|
283
|
-
/* Call recv_message_ready if we got the payload via the path field */
|
284
|
-
if (calld->seen_path_with_query && calld->recv_message_ready != nullptr) {
|
285
|
-
calld->pp_recv_message->reset(
|
286
|
-
calld->payload_bin_delivered ? nullptr
|
287
|
-
: reinterpret_cast<grpc_core::ByteStream*>(
|
288
|
-
calld->read_stream.get()));
|
289
|
-
// Re-enter call combiner for recv_message_ready, since the surface
|
290
|
-
// code will release the call combiner for each callback it receives.
|
291
|
-
GRPC_CALL_COMBINER_START(calld->call_combiner, calld->recv_message_ready,
|
292
|
-
GRPC_ERROR_REF(err),
|
293
|
-
"resuming recv_message_ready from on_complete");
|
294
|
-
calld->recv_message_ready = nullptr;
|
295
|
-
calld->payload_bin_delivered = true;
|
296
|
-
}
|
297
|
-
GRPC_CLOSURE_RUN(calld->on_complete, GRPC_ERROR_REF(err));
|
289
|
+
GRPC_CLOSURE_RUN(calld->original_recv_initial_metadata_ready, err);
|
298
290
|
}
|
299
291
|
|
300
292
|
static void hs_recv_message_ready(void* user_data, grpc_error* err) {
|
301
293
|
grpc_call_element* elem = static_cast<grpc_call_element*>(user_data);
|
302
294
|
call_data* calld = static_cast<call_data*>(elem->call_data);
|
303
|
-
|
304
|
-
|
305
|
-
//
|
295
|
+
calld->seen_recv_message_ready = true;
|
296
|
+
if (calld->seen_recv_initial_metadata_ready) {
|
297
|
+
// We've already seen the recv_initial_metadata callback, so
|
298
|
+
// replace the recv_message byte stream if needed and invoke the
|
299
|
+
// original recv_message callback immediately.
|
300
|
+
if (calld->have_read_stream) {
|
301
|
+
calld->recv_message->reset(calld->read_stream.get());
|
302
|
+
calld->have_read_stream = false;
|
303
|
+
}
|
304
|
+
GRPC_CLOSURE_RUN(calld->original_recv_message_ready, GRPC_ERROR_REF(err));
|
305
|
+
} else {
|
306
|
+
// We have not yet seen the recv_initial_metadata callback, so we
|
307
|
+
// need to wait to see if this is a GET request.
|
306
308
|
// Note that we release the call combiner here, so that other
|
307
309
|
// callbacks can run.
|
308
|
-
GRPC_CALL_COMBINER_STOP(
|
309
|
-
|
310
|
-
|
311
|
-
GRPC_CLOSURE_RUN(calld->recv_message_ready, GRPC_ERROR_REF(err));
|
310
|
+
GRPC_CALL_COMBINER_STOP(
|
311
|
+
calld->call_combiner,
|
312
|
+
"pausing recv_message_ready until recv_initial_metadata_ready");
|
312
313
|
}
|
313
314
|
}
|
314
315
|
|
@@ -320,18 +321,18 @@ static grpc_error* hs_mutate_op(grpc_call_element* elem,
|
|
320
321
|
if (op->send_initial_metadata) {
|
321
322
|
grpc_error* error = GRPC_ERROR_NONE;
|
322
323
|
static const char* error_name = "Failed sending initial metadata";
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
324
|
+
hs_add_error(error_name, &error,
|
325
|
+
grpc_metadata_batch_add_head(
|
326
|
+
op->payload->send_initial_metadata.send_initial_metadata,
|
327
|
+
&calld->status, GRPC_MDELEM_STATUS_200));
|
328
|
+
hs_add_error(error_name, &error,
|
329
|
+
grpc_metadata_batch_add_tail(
|
330
|
+
op->payload->send_initial_metadata.send_initial_metadata,
|
331
|
+
&calld->content_type,
|
332
|
+
GRPC_MDELEM_CONTENT_TYPE_APPLICATION_SLASH_GRPC));
|
333
|
+
hs_add_error(
|
333
334
|
error_name, &error,
|
334
|
-
|
335
|
+
hs_filter_outgoing_metadata(
|
335
336
|
elem, op->payload->send_initial_metadata.send_initial_metadata));
|
336
337
|
if (error != GRPC_ERROR_NONE) return error;
|
337
338
|
}
|
@@ -343,27 +344,21 @@ static grpc_error* hs_mutate_op(grpc_call_element* elem,
|
|
343
344
|
op->payload->recv_initial_metadata.recv_initial_metadata;
|
344
345
|
calld->recv_initial_metadata_flags =
|
345
346
|
op->payload->recv_initial_metadata.recv_flags;
|
346
|
-
calld->
|
347
|
+
calld->original_recv_initial_metadata_ready =
|
347
348
|
op->payload->recv_initial_metadata.recv_initial_metadata_ready;
|
348
349
|
op->payload->recv_initial_metadata.recv_initial_metadata_ready =
|
349
|
-
&calld->
|
350
|
+
&calld->recv_initial_metadata_ready;
|
350
351
|
}
|
351
352
|
|
352
353
|
if (op->recv_message) {
|
353
|
-
calld->
|
354
|
-
calld->
|
355
|
-
|
356
|
-
|
357
|
-
&calld->hs_recv_message_ready;
|
358
|
-
}
|
359
|
-
if (op->on_complete) {
|
360
|
-
calld->on_complete = op->on_complete;
|
361
|
-
op->on_complete = &calld->hs_on_complete;
|
362
|
-
}
|
354
|
+
calld->recv_message = op->payload->recv_message.recv_message;
|
355
|
+
calld->original_recv_message_ready =
|
356
|
+
op->payload->recv_message.recv_message_ready;
|
357
|
+
op->payload->recv_message.recv_message_ready = &calld->recv_message_ready;
|
363
358
|
}
|
364
359
|
|
365
360
|
if (op->send_trailing_metadata) {
|
366
|
-
grpc_error* error =
|
361
|
+
grpc_error* error = hs_filter_outgoing_metadata(
|
367
362
|
elem, op->payload->send_trailing_metadata.send_trailing_metadata);
|
368
363
|
if (error != GRPC_ERROR_NONE) return error;
|
369
364
|
}
|
@@ -385,50 +380,47 @@ static void hs_start_transport_stream_op_batch(
|
|
385
380
|
}
|
386
381
|
|
387
382
|
/* Constructor for call_data */
|
388
|
-
static grpc_error*
|
389
|
-
|
390
|
-
/* grab pointers to our data from the call element */
|
383
|
+
static grpc_error* hs_init_call_elem(grpc_call_element* elem,
|
384
|
+
const grpc_call_element_args* args) {
|
391
385
|
call_data* calld = static_cast<call_data*>(elem->call_data);
|
392
|
-
/* initialize members */
|
393
386
|
calld->call_combiner = args->call_combiner;
|
394
|
-
GRPC_CLOSURE_INIT(&calld->
|
395
|
-
|
396
|
-
GRPC_CLOSURE_INIT(&calld->hs_on_complete, hs_on_complete, elem,
|
387
|
+
GRPC_CLOSURE_INIT(&calld->recv_initial_metadata_ready,
|
388
|
+
hs_recv_initial_metadata_ready, elem,
|
397
389
|
grpc_schedule_on_exec_ctx);
|
398
|
-
GRPC_CLOSURE_INIT(&calld->
|
390
|
+
GRPC_CLOSURE_INIT(&calld->recv_message_ready, hs_recv_message_ready, elem,
|
399
391
|
grpc_schedule_on_exec_ctx);
|
400
392
|
return GRPC_ERROR_NONE;
|
401
393
|
}
|
402
394
|
|
403
395
|
/* Destructor for call_data */
|
404
|
-
static void
|
405
|
-
|
406
|
-
|
396
|
+
static void hs_destroy_call_elem(grpc_call_element* elem,
|
397
|
+
const grpc_call_final_info* final_info,
|
398
|
+
grpc_closure* ignored) {
|
407
399
|
call_data* calld = static_cast<call_data*>(elem->call_data);
|
408
|
-
if (calld->
|
400
|
+
if (calld->have_read_stream) {
|
409
401
|
calld->read_stream->Orphan();
|
410
402
|
}
|
411
403
|
}
|
412
404
|
|
413
405
|
/* Constructor for channel_data */
|
414
|
-
static grpc_error*
|
415
|
-
|
406
|
+
static grpc_error* hs_init_channel_elem(grpc_channel_element* elem,
|
407
|
+
grpc_channel_element_args* args) {
|
416
408
|
GPR_ASSERT(!args->is_last);
|
417
409
|
return GRPC_ERROR_NONE;
|
418
410
|
}
|
419
411
|
|
420
412
|
/* Destructor for channel data */
|
421
|
-
static void
|
413
|
+
static void hs_destroy_channel_elem(grpc_channel_element* elem) {}
|
422
414
|
|
423
415
|
const grpc_channel_filter grpc_http_server_filter = {
|
424
416
|
hs_start_transport_stream_op_batch,
|
425
417
|
grpc_channel_next_op,
|
426
418
|
sizeof(call_data),
|
427
|
-
|
419
|
+
hs_init_call_elem,
|
428
420
|
grpc_call_stack_ignore_set_pollset_or_pollset_set,
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
421
|
+
hs_destroy_call_elem,
|
422
|
+
0,
|
423
|
+
hs_init_channel_elem,
|
424
|
+
hs_destroy_channel_elem,
|
433
425
|
grpc_channel_next_get_info,
|
434
426
|
"http-server"};
|