grpc 1.49.1 → 1.50.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 +54 -153
- data/include/grpc/event_engine/endpoint_config.h +11 -5
- data/include/grpc/event_engine/event_engine.h +1 -1
- data/include/grpc/impl/codegen/atm_gcc_atomic.h +19 -28
- data/include/grpc/impl/codegen/atm_gcc_sync.h +0 -2
- data/include/grpc/impl/codegen/atm_windows.h +0 -2
- data/include/grpc/impl/codegen/grpc_types.h +6 -0
- data/src/core/ext/filters/channel_idle/channel_idle_filter.cc +3 -3
- data/src/core/ext/filters/client_channel/backup_poller.cc +4 -6
- data/src/core/ext/filters/client_channel/client_channel.cc +33 -22
- data/src/core/ext/filters/client_channel/client_channel.h +1 -1
- data/src/core/ext/filters/client_channel/client_channel_plugin.cc +0 -16
- data/src/core/ext/filters/client_channel/http_proxy.cc +12 -19
- data/src/core/ext/filters/client_channel/http_proxy.h +3 -2
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.cc +6 -4
- data/src/core/ext/filters/client_channel/lb_policy/child_policy_handler.h +5 -4
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/client_load_reporting_filter.cc +0 -2
- data/src/core/ext/filters/client_channel/lb_policy/grpclb/grpclb.cc +112 -96
- data/src/core/ext/filters/client_channel/lb_policy/oob_backend_metric.cc +20 -11
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.cc +106 -108
- data/src/core/ext/filters/client_channel/lb_policy/outlier_detection/outlier_detection.h +16 -0
- data/src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc +20 -13
- data/src/core/ext/filters/client_channel/lb_policy/priority/priority.cc +165 -257
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.cc +218 -231
- data/src/core/ext/filters/client_channel/lb_policy/ring_hash/ring_hash.h +10 -6
- data/src/core/ext/filters/client_channel/lb_policy/rls/rls.cc +389 -444
- data/src/core/ext/filters/client_channel/lb_policy/round_robin/round_robin.cc +16 -16
- data/src/core/ext/filters/client_channel/lb_policy/subchannel_list.h +8 -13
- data/src/core/ext/filters/client_channel/lb_policy/weighted_target/weighted_target.cc +84 -96
- data/src/core/ext/filters/client_channel/lb_policy/xds/cds.cc +38 -37
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_impl.cc +106 -186
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_manager.cc +106 -93
- data/src/core/ext/filters/client_channel/lb_policy/xds/xds_cluster_resolver.cc +170 -218
- data/src/core/ext/filters/client_channel/resolver/dns/c_ares/grpc_ares_wrapper.cc +2 -2
- data/src/core/ext/filters/client_channel/resolver/dns/native/dns_resolver.cc +1 -1
- data/src/core/ext/filters/client_channel/resolver/google_c2p/google_c2p_resolver.cc +13 -15
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.cc +84 -37
- data/src/core/ext/filters/client_channel/resolver/polling_resolver.h +11 -0
- data/src/core/ext/filters/client_channel/resolver/sockaddr/sockaddr_resolver.cc +1 -0
- data/src/core/ext/filters/client_channel/resolver/xds/xds_resolver.cc +5 -3
- data/src/core/ext/filters/client_channel/resolver_result_parsing.cc +5 -4
- data/src/core/ext/filters/client_channel/retry_filter.cc +25 -29
- data/src/core/ext/filters/client_channel/subchannel.cc +38 -33
- data/src/core/ext/filters/client_channel/subchannel.h +12 -3
- data/src/core/ext/filters/client_channel/subchannel_stream_client.cc +1 -2
- data/src/core/ext/filters/fault_injection/fault_injection_filter.cc +23 -16
- data/src/core/ext/filters/fault_injection/fault_injection_filter.h +8 -0
- data/src/core/ext/filters/http/client/http_client_filter.cc +1 -2
- data/src/core/ext/filters/http/message_compress/message_compress_filter.cc +2 -4
- data/src/core/ext/filters/http/message_compress/message_decompress_filter.cc +0 -2
- data/src/core/ext/filters/http/server/http_server_filter.cc +1 -2
- data/src/core/ext/transport/chttp2/client/chttp2_connector.cc +12 -8
- data/src/core/ext/transport/chttp2/server/chttp2_server.cc +32 -26
- data/src/core/ext/transport/chttp2/transport/bin_encoder.cc +1 -1
- data/src/core/ext/transport/chttp2/transport/chttp2_transport.cc +25 -130
- data/src/core/ext/transport/chttp2/transport/decode_huff.cc +287 -0
- data/src/core/ext/transport/chttp2/transport/decode_huff.h +1018 -0
- data/src/core/ext/transport/chttp2/transport/flow_control.cc +83 -51
- data/src/core/ext/transport/chttp2/transport/flow_control.h +11 -6
- data/src/core/ext/transport/chttp2/transport/frame_ping.cc +1 -2
- data/src/core/ext/transport/chttp2/transport/hpack_encoder.cc +2 -20
- data/src/core/ext/transport/chttp2/transport/hpack_parser.cc +28 -28
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.cc +1 -10
- data/src/core/ext/transport/chttp2/transport/hpack_parser_table.h +11 -6
- data/src/core/ext/transport/chttp2/transport/internal.h +2 -0
- data/src/core/ext/transport/chttp2/transport/parsing.cc +44 -0
- data/src/core/ext/transport/chttp2/transport/writing.cc +3 -14
- data/src/core/ext/transport/inproc/inproc_transport.cc +1 -3
- data/src/core/ext/xds/certificate_provider_store.cc +63 -3
- data/src/core/ext/xds/certificate_provider_store.h +9 -1
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.cc +5 -5
- data/src/core/ext/xds/file_watcher_certificate_provider_factory.h +1 -1
- data/src/core/ext/xds/xds_api.cc +21 -17
- data/src/core/ext/xds/xds_api.h +7 -0
- data/src/core/ext/xds/xds_bootstrap.cc +5 -537
- data/src/core/ext/xds/xds_bootstrap.h +39 -111
- data/src/core/ext/xds/xds_bootstrap_grpc.cc +370 -0
- data/src/core/ext/xds/xds_bootstrap_grpc.h +169 -0
- data/src/core/ext/xds/xds_client.cc +219 -145
- data/src/core/ext/xds/xds_client.h +19 -17
- data/src/core/ext/xds/xds_client_grpc.cc +18 -80
- data/src/core/ext/xds/xds_client_grpc.h +2 -25
- data/src/core/ext/xds/xds_client_stats.cc +4 -4
- data/src/core/ext/xds/xds_cluster.cc +87 -79
- data/src/core/ext/xds/xds_cluster.h +5 -5
- data/src/core/ext/xds/xds_cluster_specifier_plugin.cc +3 -1
- data/src/core/ext/xds/xds_common_types.cc +13 -5
- data/src/core/ext/xds/xds_endpoint.cc +8 -6
- data/src/core/ext/xds/xds_endpoint.h +3 -4
- data/src/core/ext/xds/xds_lb_policy_registry.cc +4 -2
- data/src/core/ext/xds/xds_listener.cc +25 -20
- data/src/core/ext/xds/xds_listener.h +3 -4
- data/src/core/ext/xds/xds_resource_type.h +11 -8
- data/src/core/ext/xds/xds_route_config.cc +15 -16
- data/src/core/ext/xds/xds_route_config.h +3 -3
- data/src/core/ext/xds/xds_server_config_fetcher.cc +7 -5
- data/src/core/ext/xds/xds_transport_grpc.cc +15 -7
- data/src/core/lib/backoff/backoff.cc +2 -4
- data/src/core/lib/channel/call_finalization.h +1 -3
- data/src/core/lib/channel/channel_args.h +114 -14
- data/src/core/lib/channel/channel_trace.cc +3 -4
- data/src/core/lib/channel/promise_based_filter.cc +18 -19
- data/src/core/lib/channel/status_util.cc +27 -0
- data/src/core/lib/channel/status_util.h +10 -0
- data/src/core/lib/config/core_configuration.cc +5 -1
- data/src/core/lib/config/core_configuration.h +33 -0
- data/src/core/lib/debug/stats.cc +26 -30
- data/src/core/lib/debug/stats.h +2 -12
- data/src/core/lib/debug/stats_data.cc +118 -614
- data/src/core/lib/debug/stats_data.h +67 -465
- data/src/core/lib/debug/trace.cc +0 -2
- data/src/core/lib/event_engine/channel_args_endpoint_config.cc +12 -20
- data/src/core/lib/event_engine/channel_args_endpoint_config.h +13 -7
- data/src/core/lib/event_engine/forkable.cc +1 -1
- data/src/core/lib/event_engine/poller.h +14 -12
- data/src/core/lib/event_engine/posix_engine/timer_manager.cc +53 -32
- data/src/core/lib/event_engine/posix_engine/timer_manager.h +23 -1
- data/src/core/lib/event_engine/thread_pool.cc +131 -94
- data/src/core/lib/event_engine/thread_pool.h +56 -23
- data/src/core/lib/event_engine/time_util.cc +30 -0
- data/src/core/lib/event_engine/time_util.h +32 -0
- data/src/core/lib/event_engine/utils.cc +0 -5
- data/src/core/lib/event_engine/utils.h +0 -4
- data/src/core/lib/event_engine/windows/iocp.cc +13 -7
- data/src/core/lib/event_engine/windows/iocp.h +2 -1
- data/src/core/lib/event_engine/windows/win_socket.cc +1 -1
- data/src/core/lib/experiments/config.cc +146 -0
- data/src/core/lib/experiments/config.h +43 -0
- data/src/core/lib/experiments/experiments.cc +75 -0
- data/src/core/lib/experiments/experiments.h +56 -0
- data/src/core/lib/gpr/alloc.cc +1 -9
- data/src/core/lib/gpr/log_windows.cc +0 -1
- data/src/core/lib/gpr/string_util_windows.cc +3 -30
- data/src/core/lib/gpr/sync_abseil.cc +0 -14
- data/src/core/lib/gpr/sync_posix.cc +0 -14
- data/src/core/lib/gpr/time_posix.cc +0 -6
- data/src/core/lib/gpr/time_precise.h +1 -1
- data/src/core/lib/gpr/tmpfile_windows.cc +5 -7
- data/src/core/lib/gpr/useful.h +11 -0
- data/src/core/lib/{gpr → gprpp}/env.h +25 -12
- data/src/core/lib/{gpr → gprpp}/env_linux.cc +20 -15
- data/src/core/lib/{gpr → gprpp}/env_posix.cc +11 -10
- data/src/core/lib/gprpp/env_windows.cc +56 -0
- data/src/core/lib/gprpp/fork.cc +14 -22
- data/src/core/lib/gprpp/fork.h +0 -8
- data/src/core/lib/gprpp/global_config_env.cc +7 -6
- data/src/core/lib/gprpp/notification.h +67 -0
- data/src/core/lib/gprpp/packed_table.h +40 -0
- data/src/core/lib/gprpp/ref_counted_ptr.h +20 -33
- data/src/core/lib/gprpp/sorted_pack.h +98 -0
- data/src/core/lib/gprpp/status_helper.h +6 -0
- data/src/core/lib/gprpp/table.h +9 -1
- data/src/core/lib/gprpp/tchar.cc +49 -0
- data/src/core/lib/gprpp/tchar.h +33 -0
- data/src/core/lib/gprpp/time.cc +21 -0
- data/src/core/lib/gprpp/time.h +55 -0
- data/src/core/lib/gprpp/validation_errors.cc +61 -0
- data/src/core/lib/gprpp/validation_errors.h +110 -0
- data/src/core/{ext/filters/client_channel → lib/handshaker}/proxy_mapper.h +3 -3
- data/src/core/{ext/filters/client_channel → lib/handshaker}/proxy_mapper_registry.cc +14 -36
- data/src/core/lib/handshaker/proxy_mapper_registry.h +75 -0
- data/src/core/lib/iomgr/call_combiner.cc +0 -8
- data/src/core/lib/iomgr/closure.h +0 -1
- data/src/core/lib/iomgr/endpoint_pair_posix.cc +14 -10
- data/src/core/lib/iomgr/endpoint_pair_windows.cc +2 -2
- data/src/core/lib/iomgr/ev_epoll1_linux.cc +1 -38
- data/src/core/lib/iomgr/ev_poll_posix.cc +2 -17
- data/src/core/lib/iomgr/exec_ctx.cc +0 -10
- data/src/core/lib/iomgr/exec_ctx.h +7 -31
- data/src/core/lib/iomgr/iocp_windows.cc +1 -2
- data/src/core/lib/iomgr/iomgr.cc +6 -8
- data/src/core/lib/iomgr/iomgr_fwd.h +1 -0
- data/src/core/lib/iomgr/pollset.h +1 -1
- data/src/core/lib/iomgr/pollset_set.h +0 -1
- data/src/core/lib/iomgr/resolve_address.h +1 -0
- data/src/core/lib/iomgr/resolve_address_impl.h +1 -0
- data/src/core/lib/iomgr/resolve_address_posix.cc +1 -0
- data/src/core/lib/iomgr/resolve_address_windows.cc +1 -0
- data/src/core/lib/iomgr/sockaddr_utils_posix.cc +2 -1
- data/src/core/lib/iomgr/socket_utils_common_posix.cc +12 -34
- data/src/core/lib/iomgr/socket_utils_posix.cc +83 -1
- data/src/core/lib/iomgr/socket_utils_posix.h +98 -6
- data/src/core/lib/iomgr/tcp_client.cc +6 -7
- data/src/core/lib/iomgr/tcp_client.h +11 -11
- data/src/core/lib/iomgr/tcp_client_cfstream.cc +6 -6
- data/src/core/lib/iomgr/tcp_client_posix.cc +33 -29
- data/src/core/lib/iomgr/tcp_client_posix.h +12 -9
- data/src/core/lib/iomgr/tcp_client_windows.cc +6 -6
- data/src/core/lib/iomgr/tcp_posix.cc +131 -114
- data/src/core/lib/iomgr/tcp_posix.h +3 -1
- data/src/core/lib/iomgr/tcp_server.cc +5 -4
- data/src/core/lib/iomgr/tcp_server.h +9 -6
- data/src/core/lib/iomgr/tcp_server_posix.cc +17 -28
- data/src/core/lib/iomgr/tcp_server_utils_posix.h +2 -2
- data/src/core/lib/iomgr/tcp_server_utils_posix_common.cc +3 -3
- data/src/core/lib/iomgr/tcp_server_windows.cc +6 -7
- data/src/core/lib/iomgr/tcp_windows.cc +0 -1
- data/src/core/lib/iomgr/tcp_windows.h +0 -1
- data/src/core/lib/iomgr/timer_generic.cc +4 -4
- data/src/core/lib/iomgr/timer_manager.cc +1 -2
- data/src/core/lib/iomgr/wakeup_fd_eventfd.cc +0 -2
- data/src/core/lib/json/json_object_loader.cc +21 -52
- data/src/core/lib/json/json_object_loader.h +56 -76
- data/src/core/lib/json/json_util.cc +2 -1
- data/src/core/lib/load_balancing/lb_policy.h +5 -5
- data/src/core/lib/load_balancing/lb_policy_registry.cc +29 -55
- data/src/core/lib/load_balancing/lb_policy_registry.h +23 -11
- data/src/core/lib/promise/activity.h +2 -3
- data/src/core/lib/promise/context.h +1 -1
- data/src/core/lib/promise/sleep.cc +16 -4
- data/src/core/lib/promise/sleep.h +8 -2
- data/src/core/lib/resolver/resolver.h +13 -3
- data/src/core/lib/resource_quota/api.cc +9 -0
- data/src/core/lib/resource_quota/api.h +6 -0
- data/src/core/lib/resource_quota/arena.cc +1 -3
- data/src/core/lib/resource_quota/memory_quota.cc +8 -24
- data/src/core/lib/resource_quota/memory_quota.h +6 -19
- data/src/core/lib/resource_quota/periodic_update.cc +2 -3
- data/src/core/{ext/xds → lib/security/certificate_provider}/certificate_provider_factory.h +3 -3
- data/src/core/lib/security/certificate_provider/certificate_provider_registry.cc +60 -0
- data/src/core/lib/security/certificate_provider/certificate_provider_registry.h +70 -0
- data/src/core/lib/security/credentials/channel_creds_registry_init.cc +1 -0
- data/src/core/lib/security/credentials/external/aws_external_account_credentials.cc +15 -16
- data/src/core/lib/security/credentials/external/external_account_credentials.cc +2 -1
- data/src/core/lib/security/credentials/google_default/credentials_generic.cc +5 -8
- data/src/core/lib/security/credentials/google_default/google_default_credentials.cc +6 -6
- data/src/core/lib/security/credentials/jwt/jwt_verifier.cc +3 -2
- data/src/core/lib/security/credentials/jwt/jwt_verifier.h +1 -1
- data/src/core/lib/security/credentials/oauth2/oauth2_credentials.cc +1 -2
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.cc +4 -3
- data/src/core/lib/security/credentials/tls/grpc_tls_certificate_provider.h +4 -2
- data/src/core/lib/security/credentials/tls/tls_utils.cc +3 -1
- data/src/core/lib/security/transport/client_auth_filter.cc +12 -1
- data/src/core/lib/security/transport/secure_endpoint.cc +0 -4
- data/src/core/lib/surface/call.cc +1 -11
- data/src/core/lib/surface/channel.cc +3 -2
- data/src/core/lib/surface/completion_queue.cc +16 -28
- data/src/core/lib/surface/completion_queue.h +1 -1
- data/src/core/lib/surface/completion_queue_factory.cc +5 -0
- data/src/core/lib/surface/init.cc +16 -11
- data/src/core/lib/surface/init_internally.cc +24 -0
- data/src/core/lib/surface/init_internally.h +28 -0
- data/src/core/lib/surface/server.cc +1 -7
- data/src/core/lib/surface/server.h +4 -6
- data/src/core/lib/surface/version.cc +2 -2
- data/src/core/lib/transport/bdp_estimator.cc +1 -3
- data/src/core/lib/transport/metadata_batch.cc +2 -3
- data/src/core/lib/transport/metadata_batch.h +9 -7
- data/src/core/lib/transport/parsed_metadata.h +4 -2
- data/src/core/lib/transport/status_conversion.cc +1 -3
- data/src/core/lib/transport/tcp_connect_handshaker.cc +9 -5
- data/src/core/lib/transport/transport.h +0 -1
- data/src/core/lib/transport/transport_impl.h +0 -1
- data/src/core/plugin_registry/grpc_plugin_registry.cc +23 -46
- data/src/core/plugin_registry/grpc_plugin_registry_extra.cc +13 -25
- data/src/ruby/lib/grpc/version.rb +1 -1
- data/src/ruby/spec/channel_spec.rb +5 -0
- data/src/ruby/spec/generic/server_interceptors_spec.rb +1 -1
- data/src/ruby/spec/user_agent_spec.rb +1 -1
- metadata +33 -19
- data/src/core/ext/filters/client_channel/proxy_mapper_registry.h +0 -56
- data/src/core/ext/xds/certificate_provider_registry.cc +0 -103
- data/src/core/ext/xds/certificate_provider_registry.h +0 -59
- data/src/core/lib/event_engine/promise.h +0 -78
- data/src/core/lib/gpr/env_windows.cc +0 -74
- data/src/core/lib/gpr/string_windows.h +0 -32
- data/src/core/lib/profiling/basic_timers.cc +0 -295
- data/src/core/lib/profiling/stap_timers.cc +0 -50
- data/src/core/lib/profiling/timers.h +0 -94
@@ -55,14 +55,12 @@ class RefCountedPtr {
|
|
55
55
|
|
56
56
|
// Move assignment.
|
57
57
|
RefCountedPtr& operator=(RefCountedPtr&& other) noexcept {
|
58
|
-
reset(other.value_);
|
59
|
-
other.value_ = nullptr;
|
58
|
+
reset(std::exchange(other.value_, nullptr));
|
60
59
|
return *this;
|
61
60
|
}
|
62
61
|
template <typename Y>
|
63
62
|
RefCountedPtr& operator=(RefCountedPtr<Y>&& other) noexcept {
|
64
|
-
reset(other.value_);
|
65
|
-
other.value_ = nullptr;
|
63
|
+
reset(std::exchange(other.value_, nullptr));
|
66
64
|
return *this;
|
67
65
|
}
|
68
66
|
|
@@ -108,39 +106,32 @@ class RefCountedPtr {
|
|
108
106
|
|
109
107
|
// If value is non-null, we take ownership of a ref to it.
|
110
108
|
void reset(T* value = nullptr) {
|
111
|
-
|
112
|
-
|
109
|
+
T* old_value = std::exchange(value_, value);
|
110
|
+
if (old_value != nullptr) old_value->Unref();
|
113
111
|
}
|
114
112
|
void reset(const DebugLocation& location, const char* reason,
|
115
113
|
T* value = nullptr) {
|
116
|
-
|
117
|
-
|
114
|
+
T* old_value = std::exchange(value_, value);
|
115
|
+
if (old_value != nullptr) old_value->Unref(location, reason);
|
118
116
|
}
|
119
117
|
template <typename Y>
|
120
118
|
void reset(Y* value = nullptr) {
|
121
119
|
static_assert(std::has_virtual_destructor<T>::value,
|
122
120
|
"T does not have a virtual dtor");
|
123
|
-
|
124
|
-
value_ = static_cast<T*>(value);
|
121
|
+
reset(static_cast<T*>(value));
|
125
122
|
}
|
126
123
|
template <typename Y>
|
127
124
|
void reset(const DebugLocation& location, const char* reason,
|
128
125
|
Y* value = nullptr) {
|
129
126
|
static_assert(std::has_virtual_destructor<T>::value,
|
130
127
|
"T does not have a virtual dtor");
|
131
|
-
|
132
|
-
value_ = static_cast<T*>(value);
|
128
|
+
reset(location, reason, static_cast<T*>(value));
|
133
129
|
}
|
134
130
|
|
135
|
-
//
|
136
|
-
//
|
137
|
-
//
|
138
|
-
|
139
|
-
T* release() {
|
140
|
-
T* value = value_;
|
141
|
-
value_ = nullptr;
|
142
|
-
return value;
|
143
|
-
}
|
131
|
+
// This method is mostly useful for interoperating with C code.
|
132
|
+
// Eventually use within core should be banned, except at the surface API
|
133
|
+
// boundaries.
|
134
|
+
T* release() { return std::exchange(value_, nullptr); }
|
144
135
|
|
145
136
|
T* get() const { return value_; }
|
146
137
|
|
@@ -207,14 +198,12 @@ class WeakRefCountedPtr {
|
|
207
198
|
|
208
199
|
// Move assignment.
|
209
200
|
WeakRefCountedPtr& operator=(WeakRefCountedPtr&& other) noexcept {
|
210
|
-
reset(other.value_);
|
211
|
-
other.value_ = nullptr;
|
201
|
+
reset(std::exchange(other.value_, nullptr));
|
212
202
|
return *this;
|
213
203
|
}
|
214
204
|
template <typename Y>
|
215
205
|
WeakRefCountedPtr& operator=(WeakRefCountedPtr<Y>&& other) noexcept {
|
216
|
-
reset(other.value_);
|
217
|
-
other.value_ = nullptr;
|
206
|
+
reset(std::exchange(other.value_, nullptr));
|
218
207
|
return *this;
|
219
208
|
}
|
220
209
|
|
@@ -260,28 +249,26 @@ class WeakRefCountedPtr {
|
|
260
249
|
|
261
250
|
// If value is non-null, we take ownership of a ref to it.
|
262
251
|
void reset(T* value = nullptr) {
|
263
|
-
|
264
|
-
|
252
|
+
T* old_value = std::exchange(value_, value);
|
253
|
+
if (old_value != nullptr) old_value->WeakUnref();
|
265
254
|
}
|
266
255
|
void reset(const DebugLocation& location, const char* reason,
|
267
256
|
T* value = nullptr) {
|
268
|
-
|
269
|
-
|
257
|
+
T* old_value = std::exchange(value_, value);
|
258
|
+
if (old_value != nullptr) old_value->WeakUnref(location, reason);
|
270
259
|
}
|
271
260
|
template <typename Y>
|
272
261
|
void reset(Y* value = nullptr) {
|
273
262
|
static_assert(std::has_virtual_destructor<T>::value,
|
274
263
|
"T does not have a virtual dtor");
|
275
|
-
|
276
|
-
value_ = static_cast<T*>(value);
|
264
|
+
reset(static_cast<T*>(value));
|
277
265
|
}
|
278
266
|
template <typename Y>
|
279
267
|
void reset(const DebugLocation& location, const char* reason,
|
280
268
|
Y* value = nullptr) {
|
281
269
|
static_assert(std::has_virtual_destructor<T>::value,
|
282
270
|
"T does not have a virtual dtor");
|
283
|
-
|
284
|
-
value_ = static_cast<T*>(value);
|
271
|
+
reset(location, reason, static_cast<T*>(value));
|
285
272
|
}
|
286
273
|
|
287
274
|
// TODO(roth): This method exists solely as a transition mechanism to allow
|
@@ -0,0 +1,98 @@
|
|
1
|
+
// Copyright 2022 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_CORE_LIB_GPRPP_SORTED_PACK_H
|
16
|
+
#define GRPC_CORE_LIB_GPRPP_SORTED_PACK_H
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
|
20
|
+
#include <type_traits>
|
21
|
+
|
22
|
+
namespace grpc_core {
|
23
|
+
|
24
|
+
namespace sorted_pack_detail {
|
25
|
+
|
26
|
+
// A list of types
|
27
|
+
template <typename... A>
|
28
|
+
struct Typelist {
|
29
|
+
template <template <typename...> class T>
|
30
|
+
using Instantiate = T<A...>;
|
31
|
+
|
32
|
+
template <typename C>
|
33
|
+
using PushFront = Typelist<C, A...>;
|
34
|
+
};
|
35
|
+
|
36
|
+
// Find the smallest element of Args, and the rest of the elements
|
37
|
+
template <template <typename, typename> class Cmp, typename Args>
|
38
|
+
struct Smallest;
|
39
|
+
|
40
|
+
template <template <typename, typename> class Cmp, typename Arg,
|
41
|
+
typename... Args>
|
42
|
+
struct Smallest<Cmp, Typelist<Arg, Args...>> {
|
43
|
+
using SmallestRest = Smallest<Cmp, Typelist<Args...>>;
|
44
|
+
using PrevSmallest = typename SmallestRest::Result;
|
45
|
+
using PrevRest = typename SmallestRest::Rest;
|
46
|
+
static constexpr bool kCmpResult = Cmp<Arg, PrevSmallest>::kValue;
|
47
|
+
using Result = typename std::conditional<kCmpResult, Arg, PrevSmallest>::type;
|
48
|
+
using Prefix = typename std::conditional<kCmpResult, PrevSmallest, Arg>::type;
|
49
|
+
using Rest = typename PrevRest::template PushFront<Prefix>;
|
50
|
+
};
|
51
|
+
|
52
|
+
template <template <typename, typename> class Cmp, typename Arg>
|
53
|
+
struct Smallest<Cmp, Typelist<Arg>> {
|
54
|
+
using Result = Arg;
|
55
|
+
using Rest = Typelist<>;
|
56
|
+
};
|
57
|
+
|
58
|
+
// Sort a list of types into a typelist
|
59
|
+
template <template <typename, typename> class Cmp, typename Args>
|
60
|
+
struct Sorted;
|
61
|
+
|
62
|
+
template <template <typename, typename> class Cmp, typename... Args>
|
63
|
+
struct Sorted<Cmp, Typelist<Args...>> {
|
64
|
+
using SmallestResult = Smallest<Cmp, Typelist<Args...>>;
|
65
|
+
using SmallestType = typename SmallestResult::Result;
|
66
|
+
using RestOfTypes = typename SmallestResult::Rest;
|
67
|
+
using SortedRestOfTypes = typename Sorted<Cmp, RestOfTypes>::Result;
|
68
|
+
using Result = typename SortedRestOfTypes::template PushFront<SmallestType>;
|
69
|
+
};
|
70
|
+
|
71
|
+
template <template <typename, typename> class Cmp, typename Arg>
|
72
|
+
struct Sorted<Cmp, Typelist<Arg>> {
|
73
|
+
using Result = Typelist<Arg>;
|
74
|
+
};
|
75
|
+
|
76
|
+
template <template <typename, typename> class Cmp>
|
77
|
+
struct Sorted<Cmp, Typelist<>> {
|
78
|
+
using Result = Typelist<>;
|
79
|
+
};
|
80
|
+
|
81
|
+
} // namespace sorted_pack_detail
|
82
|
+
|
83
|
+
// Given a type T<A...>, and a type comparator Cmp<P,Q>, and some set of types
|
84
|
+
// Args...:
|
85
|
+
// Sort Args... using Cmp into SortedArgs..., then instantiate T<SortedArgs...>
|
86
|
+
// as Type.
|
87
|
+
// Cmp<P,Q> should have a single constant `kValue` that is true if P < Q.
|
88
|
+
template <template <typename...> class T,
|
89
|
+
template <typename, typename> class Cmp, typename... Args>
|
90
|
+
struct WithSortedPack {
|
91
|
+
using Type = typename sorted_pack_detail::Sorted<
|
92
|
+
Cmp,
|
93
|
+
sorted_pack_detail::Typelist<Args...>>::Result::template Instantiate<T>;
|
94
|
+
};
|
95
|
+
|
96
|
+
} // namespace grpc_core
|
97
|
+
|
98
|
+
#endif // GRPC_CORE_LIB_GPRPP_SORTED_PACK_H
|
@@ -38,6 +38,12 @@ struct google_rpc_Status;
|
|
38
38
|
struct upb_Arena;
|
39
39
|
}
|
40
40
|
|
41
|
+
#define RETURN_IF_ERROR(expr) \
|
42
|
+
do { \
|
43
|
+
const absl::Status status = (expr); \
|
44
|
+
if (!status.ok()) return status; \
|
45
|
+
} while (0)
|
46
|
+
|
41
47
|
namespace grpc_core {
|
42
48
|
|
43
49
|
/// This enum should have the same value of grpc_error_ints
|
data/src/core/lib/gprpp/table.h
CHANGED
@@ -218,7 +218,7 @@ class Table {
|
|
218
218
|
|
219
219
|
// Check if this table has index I.
|
220
220
|
template <size_t I>
|
221
|
-
|
221
|
+
absl::enable_if_t<(I < sizeof...(Ts)), bool> has() const {
|
222
222
|
return present_bits_.is_set(I);
|
223
223
|
}
|
224
224
|
|
@@ -317,6 +317,14 @@ class Table {
|
|
317
317
|
ForEachImpl(std::move(f), absl::make_index_sequence<sizeof...(Ts)>());
|
318
318
|
}
|
319
319
|
|
320
|
+
// Iterate through each set field in the table if it exists in Vs, in the
|
321
|
+
// order of Vs.
|
322
|
+
template <typename F, typename... Vs>
|
323
|
+
void ForEachIn(F f) const {
|
324
|
+
ForEachImpl(std::move(f),
|
325
|
+
absl::index_sequence<table_detail::IndexOf<Vs, Ts...>()...>());
|
326
|
+
}
|
327
|
+
|
320
328
|
// Count the number of set fields in the table
|
321
329
|
size_t count() const { return present_bits_.count(); }
|
322
330
|
|
@@ -0,0 +1,49 @@
|
|
1
|
+
// Copyright 2022 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include <grpc/support/port_platform.h>
|
16
|
+
|
17
|
+
#include "src/core/lib/gprpp/tchar.h"
|
18
|
+
|
19
|
+
#ifdef GPR_WINDOWS
|
20
|
+
|
21
|
+
namespace grpc_core {
|
22
|
+
|
23
|
+
#if defined UNICODE || defined _UNICODE
|
24
|
+
TcharString CharToTchar(std::string input) {
|
25
|
+
int needed = MultiByteToWideChar(CP_UTF8, 0, input.c_str(), -1, NULL, 0);
|
26
|
+
if (needed <= 0) return TcharString();
|
27
|
+
TcharString ret(needed, L'\0');
|
28
|
+
MultiByteToWideChar(CP_UTF8, 0, input.c_str(), -1,
|
29
|
+
const_cast<LPTSTR>(ret.data()), needed);
|
30
|
+
return ret;
|
31
|
+
}
|
32
|
+
|
33
|
+
std::string TcharToChar(TcharString input) {
|
34
|
+
int needed =
|
35
|
+
WideCharToMultiByte(CP_UTF8, 0, input.c_str(), -1, NULL, 0, NULL, NULL);
|
36
|
+
if (needed <= 0) return std::string();
|
37
|
+
std::string ret(needed, '\0');
|
38
|
+
WideCharToMultiByte(CP_UTF8, 0, input.c_str(), -1,
|
39
|
+
const_cast<LPSTR>(ret.data()), needed, NULL, NULL);
|
40
|
+
return ret;
|
41
|
+
}
|
42
|
+
#else
|
43
|
+
TcharString CharToTchar(std::string input) { return input; }
|
44
|
+
std::string TcharToChar(TcharString input) { return input; }
|
45
|
+
#endif
|
46
|
+
|
47
|
+
} // namespace grpc_core
|
48
|
+
|
49
|
+
#endif
|
@@ -0,0 +1,33 @@
|
|
1
|
+
// Copyright 2022 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_CORE_LIB_GPRPP_TCHAR_H
|
16
|
+
#define GRPC_CORE_LIB_GPRPP_TCHAR_H
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
|
20
|
+
#ifdef GPR_WINDOWS
|
21
|
+
#include <string>
|
22
|
+
|
23
|
+
namespace grpc_core {
|
24
|
+
|
25
|
+
using TcharString = std::basic_string<TCHAR>;
|
26
|
+
|
27
|
+
TcharString CharToTchar(std::string input);
|
28
|
+
std::string TcharToChar(TcharString input);
|
29
|
+
|
30
|
+
} // namespace grpc_core
|
31
|
+
#endif
|
32
|
+
|
33
|
+
#endif // GRPC_CORE_LIB_GPRPP_TCHAR_H
|
data/src/core/lib/gprpp/time.cc
CHANGED
@@ -28,6 +28,8 @@
|
|
28
28
|
#include <grpc/impl/codegen/gpr_types.h>
|
29
29
|
#include <grpc/support/log.h>
|
30
30
|
|
31
|
+
#include "src/core/lib/gprpp/no_destruct.h"
|
32
|
+
|
31
33
|
namespace grpc_core {
|
32
34
|
|
33
35
|
namespace {
|
@@ -35,6 +37,13 @@ namespace {
|
|
35
37
|
std::atomic<int64_t> g_process_epoch_seconds;
|
36
38
|
std::atomic<gpr_cycle_counter> g_process_epoch_cycles;
|
37
39
|
|
40
|
+
class GprNowTimeSource final : public Timestamp::Source {
|
41
|
+
public:
|
42
|
+
Timestamp Now() override {
|
43
|
+
return Timestamp::FromTimespecRoundDown(gpr_now(GPR_CLOCK_MONOTONIC));
|
44
|
+
}
|
45
|
+
};
|
46
|
+
|
38
47
|
GPR_ATTRIBUTE_NOINLINE std::pair<int64_t, gpr_cycle_counter> InitTime() {
|
39
48
|
gpr_cycle_counter cycles_start = 0;
|
40
49
|
gpr_cycle_counter cycles_end = 0;
|
@@ -133,6 +142,18 @@ int64_t TimespanToMillisRoundDown(gpr_timespec ts) {
|
|
133
142
|
|
134
143
|
} // namespace
|
135
144
|
|
145
|
+
GPR_THREAD_LOCAL(Timestamp::Source*)
|
146
|
+
Timestamp::thread_local_time_source_{
|
147
|
+
NoDestructSingleton<GprNowTimeSource>::Get()};
|
148
|
+
|
149
|
+
Timestamp ScopedTimeCache::Now() {
|
150
|
+
if (!cached_time_.has_value()) {
|
151
|
+
previous()->InvalidateCache();
|
152
|
+
cached_time_ = previous()->Now();
|
153
|
+
}
|
154
|
+
return cached_time_.value();
|
155
|
+
}
|
156
|
+
|
136
157
|
Timestamp Timestamp::FromTimespecRoundUp(gpr_timespec ts) {
|
137
158
|
return FromMillisecondsAfterProcessEpoch(TimespanToMillisRoundUp(gpr_time_sub(
|
138
159
|
gpr_convert_clock_type(ts, GPR_CLOCK_MONOTONIC), StartTime())));
|
data/src/core/lib/gprpp/time.h
CHANGED
@@ -23,11 +23,14 @@
|
|
23
23
|
#include <ostream>
|
24
24
|
#include <string>
|
25
25
|
|
26
|
+
#include "absl/types/optional.h"
|
27
|
+
|
26
28
|
#include <grpc/event_engine/event_engine.h>
|
27
29
|
#include <grpc/impl/codegen/gpr_types.h>
|
28
30
|
#include <grpc/support/time.h>
|
29
31
|
|
30
32
|
#include "src/core/lib/gpr/time_precise.h"
|
33
|
+
#include "src/core/lib/gpr/tls.h"
|
31
34
|
#include "src/core/lib/gpr/useful.h"
|
32
35
|
|
33
36
|
namespace grpc_core {
|
@@ -61,6 +64,35 @@ class Duration;
|
|
61
64
|
// Timestamp represents a discrete point in time.
|
62
65
|
class Timestamp {
|
63
66
|
public:
|
67
|
+
// Base interface for time providers.
|
68
|
+
class Source {
|
69
|
+
public:
|
70
|
+
// Return the current time.
|
71
|
+
virtual Timestamp Now() = 0;
|
72
|
+
virtual void InvalidateCache() {}
|
73
|
+
|
74
|
+
protected:
|
75
|
+
// We don't delete through this interface, so non-virtual dtor is fine.
|
76
|
+
~Source() = default;
|
77
|
+
};
|
78
|
+
|
79
|
+
class ScopedSource : public Source {
|
80
|
+
public:
|
81
|
+
ScopedSource() : previous_(thread_local_time_source_) {
|
82
|
+
thread_local_time_source_ = this;
|
83
|
+
}
|
84
|
+
ScopedSource(const ScopedSource&) = delete;
|
85
|
+
ScopedSource& operator=(const ScopedSource&) = delete;
|
86
|
+
void InvalidateCache() override { previous_->InvalidateCache(); }
|
87
|
+
|
88
|
+
protected:
|
89
|
+
~ScopedSource() { thread_local_time_source_ = previous_; }
|
90
|
+
Source* previous() const { return previous_; }
|
91
|
+
|
92
|
+
private:
|
93
|
+
Source* const previous_;
|
94
|
+
};
|
95
|
+
|
64
96
|
constexpr Timestamp() = default;
|
65
97
|
// Constructs a Timestamp from a gpr_timespec.
|
66
98
|
static Timestamp FromTimespecRoundDown(gpr_timespec t);
|
@@ -70,6 +102,8 @@ class Timestamp {
|
|
70
102
|
static Timestamp FromCycleCounterRoundUp(gpr_cycle_counter c);
|
71
103
|
static Timestamp FromCycleCounterRoundDown(gpr_cycle_counter c);
|
72
104
|
|
105
|
+
static Timestamp Now() { return thread_local_time_source_->Now(); }
|
106
|
+
|
73
107
|
static constexpr Timestamp FromMillisecondsAfterProcessEpoch(int64_t millis) {
|
74
108
|
return Timestamp(millis);
|
75
109
|
}
|
@@ -116,6 +150,21 @@ class Timestamp {
|
|
116
150
|
explicit constexpr Timestamp(int64_t millis) : millis_(millis) {}
|
117
151
|
|
118
152
|
int64_t millis_ = 0;
|
153
|
+
static GPR_THREAD_LOCAL(Timestamp::Source*) thread_local_time_source_;
|
154
|
+
};
|
155
|
+
|
156
|
+
class ScopedTimeCache final : public Timestamp::ScopedSource {
|
157
|
+
public:
|
158
|
+
Timestamp Now() override;
|
159
|
+
|
160
|
+
void InvalidateCache() override {
|
161
|
+
cached_time_ = absl::nullopt;
|
162
|
+
Timestamp::ScopedSource::InvalidateCache();
|
163
|
+
}
|
164
|
+
void TestOnlySetNow(Timestamp now) { cached_time_ = now; }
|
165
|
+
|
166
|
+
private:
|
167
|
+
absl::optional<Timestamp> cached_time_;
|
119
168
|
};
|
120
169
|
|
121
170
|
// Duration represents a span of time.
|
@@ -200,6 +249,7 @@ class Duration {
|
|
200
249
|
}
|
201
250
|
return *this;
|
202
251
|
}
|
252
|
+
Duration& operator*=(double multiplier);
|
203
253
|
Duration& operator+=(Duration other) {
|
204
254
|
millis_ += other.millis_;
|
205
255
|
return *this;
|
@@ -287,6 +337,11 @@ inline Duration Duration::FromSecondsAsDouble(double seconds) {
|
|
287
337
|
return Milliseconds(static_cast<int64_t>(millis));
|
288
338
|
}
|
289
339
|
|
340
|
+
inline Duration& Duration::operator*=(double multiplier) {
|
341
|
+
*this = *this * multiplier;
|
342
|
+
return *this;
|
343
|
+
}
|
344
|
+
|
290
345
|
inline Timestamp& Timestamp::operator+=(Duration duration) {
|
291
346
|
return *this = (*this + duration);
|
292
347
|
}
|
@@ -0,0 +1,61 @@
|
|
1
|
+
// Copyright 2020 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#include <grpc/support/port_platform.h>
|
16
|
+
|
17
|
+
#include "src/core/lib/gprpp/validation_errors.h"
|
18
|
+
|
19
|
+
#include <algorithm>
|
20
|
+
#include <utility>
|
21
|
+
|
22
|
+
#include "absl/status/status.h"
|
23
|
+
#include "absl/strings/str_cat.h"
|
24
|
+
#include "absl/strings/str_join.h"
|
25
|
+
#include "absl/strings/strip.h"
|
26
|
+
|
27
|
+
namespace grpc_core {
|
28
|
+
|
29
|
+
void ValidationErrors::PushField(absl::string_view ext) {
|
30
|
+
// Skip leading '.' for top-level field names.
|
31
|
+
if (fields_.empty()) absl::ConsumePrefix(&ext, ".");
|
32
|
+
fields_.emplace_back(std::string(ext));
|
33
|
+
}
|
34
|
+
|
35
|
+
void ValidationErrors::PopField() { fields_.pop_back(); }
|
36
|
+
|
37
|
+
void ValidationErrors::AddError(absl::string_view error) {
|
38
|
+
field_errors_[absl::StrJoin(fields_, "")].emplace_back(error);
|
39
|
+
}
|
40
|
+
|
41
|
+
bool ValidationErrors::FieldHasErrors() const {
|
42
|
+
return field_errors_.find(absl::StrJoin(fields_, "")) != field_errors_.end();
|
43
|
+
}
|
44
|
+
|
45
|
+
absl::Status ValidationErrors::status(absl::string_view prefix) const {
|
46
|
+
if (field_errors_.empty()) return absl::OkStatus();
|
47
|
+
std::vector<std::string> errors;
|
48
|
+
for (const auto& p : field_errors_) {
|
49
|
+
if (p.second.size() > 1) {
|
50
|
+
errors.emplace_back(absl::StrCat("field:", p.first, " errors:[",
|
51
|
+
absl::StrJoin(p.second, "; "), "]"));
|
52
|
+
} else {
|
53
|
+
errors.emplace_back(
|
54
|
+
absl::StrCat("field:", p.first, " error:", p.second[0]));
|
55
|
+
}
|
56
|
+
}
|
57
|
+
return absl::InvalidArgumentError(
|
58
|
+
absl::StrCat(prefix, ": [", absl::StrJoin(errors, "; "), "]"));
|
59
|
+
}
|
60
|
+
|
61
|
+
} // namespace grpc_core
|
@@ -0,0 +1,110 @@
|
|
1
|
+
// Copyright 2020 gRPC authors.
|
2
|
+
//
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
// you may not use this file except in compliance with the License.
|
5
|
+
// You may obtain a copy of the License at
|
6
|
+
//
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
//
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
// See the License for the specific language governing permissions and
|
13
|
+
// limitations under the License.
|
14
|
+
|
15
|
+
#ifndef GRPC_CORE_LIB_GPRPP_VALIDATION_ERRORS_H
|
16
|
+
#define GRPC_CORE_LIB_GPRPP_VALIDATION_ERRORS_H
|
17
|
+
|
18
|
+
#include <grpc/support/port_platform.h>
|
19
|
+
|
20
|
+
#include <stddef.h>
|
21
|
+
|
22
|
+
#include <map>
|
23
|
+
#include <string>
|
24
|
+
#include <vector>
|
25
|
+
|
26
|
+
#include "absl/status/status.h"
|
27
|
+
#include "absl/strings/string_view.h"
|
28
|
+
|
29
|
+
namespace grpc_core {
|
30
|
+
|
31
|
+
// Tracks errors that occur during validation of a data structure (e.g.,
|
32
|
+
// a JSON object or protobuf message). Errors are tracked based on
|
33
|
+
// which field they are associated with. If at least one error occurs
|
34
|
+
// during validation, the validation failed.
|
35
|
+
//
|
36
|
+
// Example usage:
|
37
|
+
//
|
38
|
+
// absl::StatusOr<std::string> GetFooBar(const Json::Object& json) {
|
39
|
+
// ValidationErrors errors;
|
40
|
+
// {
|
41
|
+
// ValidationErrors::ScopedField field("foo");
|
42
|
+
// auto it = json.object_value().find("foo");
|
43
|
+
// if (it == json.object_value().end()) {
|
44
|
+
// errors.AddError("field not present");
|
45
|
+
// } else if (it->second.type() != Json::Type::OBJECT) {
|
46
|
+
// errors.AddError("must be a JSON object");
|
47
|
+
// } else {
|
48
|
+
// const Json& foo = it->second;
|
49
|
+
// ValidationErrors::ScopedField field(".bar");
|
50
|
+
// auto it = foo.object_value().find("bar");
|
51
|
+
// if (it == json.object_value().end()) {
|
52
|
+
// errors.AddError("field not present");
|
53
|
+
// } else if (it->second.type() != Json::Type::STRING) {
|
54
|
+
// errors.AddError("must be a JSON string");
|
55
|
+
// } else {
|
56
|
+
// return it->second.string_value();
|
57
|
+
// }
|
58
|
+
// }
|
59
|
+
// }
|
60
|
+
// return errors.status("errors validating foo.bar");
|
61
|
+
// }
|
62
|
+
class ValidationErrors {
|
63
|
+
public:
|
64
|
+
// Pushes a field name onto the stack at construction and pops it off
|
65
|
+
// of the stack at destruction.
|
66
|
+
class ScopedField {
|
67
|
+
public:
|
68
|
+
ScopedField(ValidationErrors* errors, absl::string_view field_name)
|
69
|
+
: errors_(errors) {
|
70
|
+
errors_->PushField(field_name);
|
71
|
+
}
|
72
|
+
~ScopedField() { errors_->PopField(); }
|
73
|
+
|
74
|
+
private:
|
75
|
+
ValidationErrors* errors_;
|
76
|
+
};
|
77
|
+
|
78
|
+
// Records that we've encountered an error associated with the current
|
79
|
+
// field.
|
80
|
+
void AddError(absl::string_view error) GPR_ATTRIBUTE_NOINLINE;
|
81
|
+
|
82
|
+
// Returns true if the current field has errors.
|
83
|
+
bool FieldHasErrors() const GPR_ATTRIBUTE_NOINLINE;
|
84
|
+
|
85
|
+
// Returns the resulting status of parsing.
|
86
|
+
absl::Status status(absl::string_view prefix) const;
|
87
|
+
|
88
|
+
// Returns true if there are no errors.
|
89
|
+
bool ok() const { return field_errors_.empty(); }
|
90
|
+
|
91
|
+
size_t size() const { return field_errors_.size(); }
|
92
|
+
|
93
|
+
private:
|
94
|
+
// Pushes a field name onto the stack.
|
95
|
+
void PushField(absl::string_view ext) GPR_ATTRIBUTE_NOINLINE;
|
96
|
+
// Pops a field name off of the stack.
|
97
|
+
void PopField() GPR_ATTRIBUTE_NOINLINE;
|
98
|
+
|
99
|
+
// Errors that we have encountered so far, keyed by field name.
|
100
|
+
// TODO(roth): If we don't actually have any fields for which we
|
101
|
+
// report more than one error, simplify this data structure.
|
102
|
+
std::map<std::string /*field_name*/, std::vector<std::string>> field_errors_;
|
103
|
+
// Stack of field names indicating the field that we are currently
|
104
|
+
// validating.
|
105
|
+
std::vector<std::string> fields_;
|
106
|
+
};
|
107
|
+
|
108
|
+
} // namespace grpc_core
|
109
|
+
|
110
|
+
#endif // GRPC_CORE_LIB_GPRPP_VALIDATION_ERRORS_H
|
@@ -16,8 +16,8 @@
|
|
16
16
|
*
|
17
17
|
*/
|
18
18
|
|
19
|
-
#ifndef
|
20
|
-
#define
|
19
|
+
#ifndef GRPC_CORE_LIB_HANDSHAKER_PROXY_MAPPER_H
|
20
|
+
#define GRPC_CORE_LIB_HANDSHAKER_PROXY_MAPPER_H
|
21
21
|
|
22
22
|
#include <grpc/support/port_platform.h>
|
23
23
|
|
@@ -50,4 +50,4 @@ class ProxyMapperInterface {
|
|
50
50
|
|
51
51
|
} // namespace grpc_core
|
52
52
|
|
53
|
-
#endif /*
|
53
|
+
#endif /* GRPC_CORE_LIB_HANDSHAKER_PROXY_MAPPER_H */
|