Skip to content

Commit 5d0b1df

Browse files
gRPC Team Botcopybara-github
gRPC Team Bot
authored andcommitted
Change upb C generated map iteration function to not hand out MapEntry pointers.
Users relying on internal upb functions may be broken as these are meant to be *internal*. In the interim, users may need to update their code by using the new Map iteration API. PiperOrigin-RevId: 730929091
1 parent 4c3a794 commit 5d0b1df

File tree

8 files changed

+263
-241
lines changed

8 files changed

+263
-241
lines changed

src/core/lib/security/authorization/cel_authorization_engine.cc

+27-23
Original file line numberDiff line numberDiff line change
@@ -69,29 +69,33 @@ CelAuthorizationEngine::CelAuthorizationEngine(
6969
// Extract array of policies and store their condition fields in either
7070
// allow_if_matched_ or deny_if_matched_, depending on the policy action.
7171
upb::Arena temp_arena;
72-
size_t policy_num = kUpb_Map_Begin;
73-
const envoy_config_rbac_v3_RBAC_PoliciesEntry* policy_entry;
74-
while ((policy_entry = envoy_config_rbac_v3_RBAC_policies_next(
75-
rbac_policy, &policy_num)) != nullptr) {
76-
const upb_StringView policy_name_strview =
77-
envoy_config_rbac_v3_RBAC_PoliciesEntry_key(policy_entry);
78-
const std::string policy_name(policy_name_strview.data,
79-
policy_name_strview.size);
80-
const envoy_config_rbac_v3_Policy* policy =
81-
envoy_config_rbac_v3_RBAC_PoliciesEntry_value(policy_entry);
82-
const google_api_expr_v1alpha1_Expr* condition =
83-
envoy_config_rbac_v3_Policy_condition(policy);
84-
// Parse condition to make a pointer tied to the lifetime of arena_.
85-
size_t serial_len;
86-
const char* serialized = google_api_expr_v1alpha1_Expr_serialize(
87-
condition, temp_arena.ptr(), &serial_len);
88-
const google_api_expr_v1alpha1_Expr* parsed_condition =
89-
google_api_expr_v1alpha1_Expr_parse(serialized, serial_len,
90-
arena_.ptr());
91-
if (envoy_config_rbac_v3_RBAC_action(rbac_policy) == kAllow) {
92-
allow_if_matched_.insert(std::pair(policy_name, parsed_condition));
93-
} else {
94-
deny_if_matched_.insert(std::pair(policy_name, parsed_condition));
72+
// TODO(b/397931390): Clean up the code after gRPC OSS migrates to proto
73+
// v30.0.
74+
const upb_Map* upb_map =
75+
_envoy_config_rbac_v3_RBAC_policies_upb_map(rbac_policy);
76+
if (upb_map) {
77+
size_t policy_num = kUpb_Map_Begin;
78+
upb_MessageValue k, v;
79+
while (upb_Map_Next(upb_map, &k, &v, &policy_num)) {
80+
upb_StringView policy_name_strview = k.str_val;
81+
const envoy_config_rbac_v3_Policy* policy =
82+
(envoy_config_rbac_v3_Policy*)v.msg_val;
83+
const std::string policy_name(policy_name_strview.data,
84+
policy_name_strview.size);
85+
const google_api_expr_v1alpha1_Expr* condition =
86+
envoy_config_rbac_v3_Policy_condition(policy);
87+
// Parse condition to make a pointer tied to the lifetime of arena_.
88+
size_t serial_len;
89+
const char* serialized = google_api_expr_v1alpha1_Expr_serialize(
90+
condition, temp_arena.ptr(), &serial_len);
91+
const google_api_expr_v1alpha1_Expr* parsed_condition =
92+
google_api_expr_v1alpha1_Expr_parse(serialized, serial_len,
93+
arena_.ptr());
94+
if (envoy_config_rbac_v3_RBAC_action(rbac_policy) == kAllow) {
95+
allow_if_matched_.insert(std::pair(policy_name, parsed_condition));
96+
} else {
97+
deny_if_matched_.insert(std::pair(policy_name, parsed_condition));
98+
}
9599
}
96100
}
97101
}

src/core/load_balancing/backend_metric_parser.cc

+21-28
Original file line numberDiff line numberDiff line change
@@ -31,23 +31,23 @@ namespace grpc_core {
3131

3232
namespace {
3333

34-
template <typename EntryType>
34+
// TODO(b/397931390): Clean up the code after gRPC OSS migrates to proto v30.0.
3535
std::map<absl::string_view, double> ParseMap(
3636
xds_data_orca_v3_OrcaLoadReport* msg,
37-
const EntryType* (*entry_func)(const xds_data_orca_v3_OrcaLoadReport*,
38-
size_t*),
39-
upb_StringView (*key_func)(const EntryType*),
40-
double (*value_func)(const EntryType*),
37+
const upb_Map* (*upb_map_func)(xds_data_orca_v3_OrcaLoadReport*),
4138
BackendMetricAllocatorInterface* allocator) {
39+
const upb_Map* map = upb_map_func(msg);
4240
std::map<absl::string_view, double> result;
43-
size_t i = kUpb_Map_Begin;
44-
while (true) {
45-
const auto* entry = entry_func(msg, &i);
46-
if (entry == nullptr) break;
47-
upb_StringView key_view = key_func(entry);
48-
char* key = allocator->AllocateString(key_view.size);
49-
memcpy(key, key_view.data, key_view.size);
50-
result[absl::string_view(key, key_view.size)] = value_func(entry);
41+
if (map) {
42+
size_t i = kUpb_Map_Begin;
43+
upb_MessageValue k, v;
44+
while (upb_Map_Next(map, &k, &v, &i)) {
45+
upb_StringView key_view = k.str_val;
46+
double value = v.double_val;
47+
char* key = allocator->AllocateString(key_view.size);
48+
memcpy(key, key_view.data, key_view.size);
49+
result[absl::string_view(key, key_view.size)] = value;
50+
}
5151
}
5252
return result;
5353
}
@@ -73,21 +73,14 @@ const BackendMetricData* ParseBackendMetricData(
7373
backend_metric_data->qps =
7474
xds_data_orca_v3_OrcaLoadReport_rps_fractional(msg);
7575
backend_metric_data->eps = xds_data_orca_v3_OrcaLoadReport_eps(msg);
76-
backend_metric_data->request_cost =
77-
ParseMap<xds_data_orca_v3_OrcaLoadReport_RequestCostEntry>(
78-
msg, xds_data_orca_v3_OrcaLoadReport_request_cost_next,
79-
xds_data_orca_v3_OrcaLoadReport_RequestCostEntry_key,
80-
xds_data_orca_v3_OrcaLoadReport_RequestCostEntry_value, allocator);
81-
backend_metric_data->utilization =
82-
ParseMap<xds_data_orca_v3_OrcaLoadReport_UtilizationEntry>(
83-
msg, xds_data_orca_v3_OrcaLoadReport_utilization_next,
84-
xds_data_orca_v3_OrcaLoadReport_UtilizationEntry_key,
85-
xds_data_orca_v3_OrcaLoadReport_UtilizationEntry_value, allocator);
86-
backend_metric_data->named_metrics =
87-
ParseMap<xds_data_orca_v3_OrcaLoadReport_NamedMetricsEntry>(
88-
msg, xds_data_orca_v3_OrcaLoadReport_named_metrics_next,
89-
xds_data_orca_v3_OrcaLoadReport_NamedMetricsEntry_key,
90-
xds_data_orca_v3_OrcaLoadReport_NamedMetricsEntry_value, allocator);
76+
// TODO(b/397931390): Clean up the code after gRPC OSS migrates to proto
77+
// v30.0.
78+
backend_metric_data->request_cost = ParseMap(
79+
msg, _xds_data_orca_v3_OrcaLoadReport_request_cost_upb_map, allocator);
80+
backend_metric_data->utilization = ParseMap(
81+
msg, _xds_data_orca_v3_OrcaLoadReport_utilization_upb_map, allocator);
82+
backend_metric_data->named_metrics = ParseMap(
83+
msg, _xds_data_orca_v3_OrcaLoadReport_named_metrics_upb_map, allocator);
9184
return backend_metric_data;
9285
}
9386

src/core/tsi/alts/handshaker/alts_tsi_handshaker.cc

+14-14
Original file line numberDiff line numberDiff line change
@@ -347,22 +347,22 @@ tsi_result alts_tsi_handshaker_result_create(grpc_gcp_HandshakerResp* resp,
347347
return TSI_FAILED_PRECONDITION;
348348
}
349349
if (grpc_gcp_Identity_attributes_size(identity) != 0) {
350-
size_t iter = kUpb_Map_Begin;
351-
grpc_gcp_Identity_AttributesEntry* peer_attributes_entry =
352-
grpc_gcp_Identity_attributes_nextmutable(peer_identity, &iter);
353-
while (peer_attributes_entry != nullptr) {
354-
upb_StringView key = grpc_gcp_Identity_AttributesEntry_key(
355-
const_cast<grpc_gcp_Identity_AttributesEntry*>(
356-
peer_attributes_entry));
357-
upb_StringView val = grpc_gcp_Identity_AttributesEntry_value(
358-
const_cast<grpc_gcp_Identity_AttributesEntry*>(
359-
peer_attributes_entry));
360-
grpc_gcp_AltsContext_peer_attributes_set(context, key, val,
361-
context_arena.ptr());
362-
peer_attributes_entry =
363-
grpc_gcp_Identity_attributes_nextmutable(peer_identity, &iter);
350+
// TODO(b/397931390): Clean up the code after gRPC OSS migrates to proto
351+
// v30.0.
352+
const upb_Map* upb_map =
353+
_grpc_gcp_Identity_attributes_upb_map(peer_identity);
354+
if (upb_map) {
355+
size_t iter = kUpb_Map_Begin;
356+
upb_MessageValue k, v;
357+
while (upb_Map_Next(upb_map, &k, &v, &iter)) {
358+
upb_StringView key = k.str_val;
359+
upb_StringView val = v.str_val;
360+
grpc_gcp_AltsContext_peer_attributes_set(context, key, val,
361+
context_arena.ptr());
362+
}
364363
}
365364
}
365+
366366
size_t serialized_ctx_length;
367367
char* serialized_ctx = grpc_gcp_AltsContext_serialize(
368368
context, context_arena.ptr(), &serialized_ctx_length);

src/core/xds/grpc/xds_http_rbac_filter.cc

+19-12
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,8 @@
5252
#include "src/core/xds/grpc/xds_bootstrap_grpc.h"
5353
#include "src/core/xds/grpc/xds_common_types_parser.h"
5454
#include "src/core/xds/xds_client/xds_client.h"
55+
#include "upb/base/string_view.h"
56+
#include "upb/message/array.h"
5557
#include "upb/message/map.h"
5658

5759
namespace grpc_core {
@@ -450,19 +452,24 @@ Json ParseHttpRbacToJson(const XdsResourceType::DecodeContext& context,
450452
"action", Json::FromNumber(envoy_config_rbac_v3_RBAC_action(rules)));
451453
if (envoy_config_rbac_v3_RBAC_policies_size(rules) != 0) {
452454
Json::Object policies_object;
453-
size_t iter = kUpb_Map_Begin;
454-
while (true) {
455-
auto* entry = envoy_config_rbac_v3_RBAC_policies_next(rules, &iter);
456-
if (entry == nullptr) {
457-
break;
455+
// TODO(b/397931390): Clean up the code after gRPC OSS migrates to proto
456+
// v30.0.
457+
envoy_config_rbac_v3_RBAC* rules_upb = (envoy_config_rbac_v3_RBAC*)rules;
458+
const upb_Map* rules_upb_map =
459+
_envoy_config_rbac_v3_RBAC_policies_upb_map(rules_upb);
460+
if (rules_upb_map) {
461+
size_t iter = kUpb_Map_Begin;
462+
upb_MessageValue k, v;
463+
while (upb_Map_Next(rules_upb_map, &k, &v, &iter)) {
464+
upb_StringView key_view = k.str_val;
465+
const envoy_config_rbac_v3_Policy* val =
466+
(envoy_config_rbac_v3_Policy*)v.msg_val;
467+
absl::string_view key = UpbStringToAbsl(key_view);
468+
ValidationErrors::ScopedField field(
469+
errors, absl::StrCat(".policies[", key, "]"));
470+
Json policy = ParsePolicyToJson(val, errors);
471+
policies_object.emplace(std::string(key), std::move(policy));
458472
}
459-
absl::string_view key =
460-
UpbStringToAbsl(envoy_config_rbac_v3_RBAC_PoliciesEntry_key(entry));
461-
ValidationErrors::ScopedField field(
462-
errors, absl::StrCat(".policies[", key, "]"));
463-
Json policy = ParsePolicyToJson(
464-
envoy_config_rbac_v3_RBAC_PoliciesEntry_value(entry), errors);
465-
policies_object.emplace(std::string(key), std::move(policy));
466473
}
467474
inner_rbac_json.emplace("policies",
468475
Json::FromObject(std::move(policies_object)));

src/core/xds/grpc/xds_metadata_parser.cc

+60-47
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@
3434
#include "src/core/xds/grpc/xds_common_types.h"
3535
#include "src/core/xds/grpc/xds_common_types_parser.h"
3636
#include "upb/base/string_view.h"
37+
#include "upb/message/array.h"
38+
#include "upb/message/map.h"
39+
#include "upb/message/message.h"
3740
#include "upb/text/encode.h"
3841

3942
namespace grpc_core {
@@ -126,56 +129,66 @@ XdsMetadataMap ParseXdsMetadataMap(
126129
XdsMetadataMap metadata_map;
127130
if (metadata == nullptr) return metadata_map; // Not present == empty.
128131
// First, try typed_filter_metadata.
129-
size_t iter = kUpb_Map_Begin;
130-
const envoy_config_core_v3_Metadata_TypedFilterMetadataEntry* typed_entry;
131-
while (
132-
(typed_entry = envoy_config_core_v3_Metadata_typed_filter_metadata_next(
133-
metadata, &iter)) != nullptr) {
134-
absl::string_view key = UpbStringToAbsl(
135-
envoy_config_core_v3_Metadata_TypedFilterMetadataEntry_key(
136-
typed_entry));
137-
ValidationErrors::ScopedField field(
138-
errors, absl::StrCat(".typed_filter_metadata[", key, "]"));
139-
auto extension = ExtractXdsExtension(
140-
context,
141-
envoy_config_core_v3_Metadata_TypedFilterMetadataEntry_value(
142-
typed_entry),
143-
errors);
144-
if (!extension.has_value()) continue;
145-
// TODO(roth): If we start to need a lot of types here, refactor
146-
// this into a separate registry.
147-
std::unique_ptr<XdsMetadataValue> metadata_value;
148-
if (XdsGcpAuthFilterEnabled() &&
149-
extension->type == XdsGcpAuthnAudienceMetadataValue::Type()) {
150-
metadata_value =
151-
ParseGcpAuthnAudience(context, std::move(*extension), errors);
152-
} else if (XdsHttpConnectEnabled() &&
153-
extension->type == XdsAddressMetadataValue::Type()) {
154-
metadata_value = ParseAddress(context, std::move(*extension), errors);
155-
}
156-
if (metadata_value != nullptr) {
157-
metadata_map.Insert(key, std::move(metadata_value));
132+
// TODO(b/397931390): Clean up the code after gRPC OSS migrates to proto
133+
// v30.0.
134+
envoy_config_core_v3_Metadata* metadata_upb =
135+
(envoy_config_core_v3_Metadata*)metadata;
136+
const upb_Map* typed_filter_metadata_upb_map =
137+
_envoy_config_core_v3_Metadata_typed_filter_metadata_upb_map(
138+
metadata_upb);
139+
if (typed_filter_metadata_upb_map) {
140+
size_t iter = kUpb_Map_Begin;
141+
upb_MessageValue k, v;
142+
while (upb_Map_Next(typed_filter_metadata_upb_map, &k, &v, &iter)) {
143+
upb_StringView typed_filter_metadata_key_view = k.str_val;
144+
const google_protobuf_Any* typed_filter_metadata_val =
145+
(google_protobuf_Any*)v.msg_val;
146+
absl::string_view key = UpbStringToAbsl(typed_filter_metadata_key_view);
147+
ValidationErrors::ScopedField field(
148+
errors, absl::StrCat(".typed_filter_metadata[", key, "]"));
149+
auto extension =
150+
ExtractXdsExtension(context, typed_filter_metadata_val, errors);
151+
if (!extension.has_value()) continue;
152+
// TODO(roth): If we start to need a lot of types here, refactor
153+
// this into a separate registry.
154+
std::unique_ptr<XdsMetadataValue> metadata_value;
155+
if (XdsGcpAuthFilterEnabled() &&
156+
extension->type == XdsGcpAuthnAudienceMetadataValue::Type()) {
157+
metadata_value =
158+
ParseGcpAuthnAudience(context, std::move(*extension), errors);
159+
} else if (XdsHttpConnectEnabled() &&
160+
extension->type == XdsAddressMetadataValue::Type()) {
161+
metadata_value = ParseAddress(context, std::move(*extension), errors);
162+
}
163+
if (metadata_value != nullptr) {
164+
metadata_map.Insert(key, std::move(metadata_value));
165+
}
158166
}
159167
}
160168
// Then, try filter_metadata.
161-
iter = kUpb_Map_Begin;
162-
const envoy_config_core_v3_Metadata_FilterMetadataEntry* entry;
163-
while ((entry = envoy_config_core_v3_Metadata_filter_metadata_next(
164-
metadata, &iter)) != nullptr) {
165-
absl::string_view key = UpbStringToAbsl(
166-
envoy_config_core_v3_Metadata_FilterMetadataEntry_key(entry));
167-
auto json = ParseProtobufStructToJson(
168-
context,
169-
envoy_config_core_v3_Metadata_FilterMetadataEntry_value(entry));
170-
if (!json.ok()) {
171-
ValidationErrors::ScopedField field(
172-
errors, absl::StrCat(".filter_metadata[", key, "]"));
173-
errors->AddError(json.status().message());
174-
}
175-
// Add only if not already added from typed_filter_metadata.
176-
else if (metadata_map.Find(key) == nullptr) {
177-
metadata_map.Insert(
178-
key, std::make_unique<XdsStructMetadataValue>(std::move(*json)));
169+
// TODO(b/397931390): Clean up the code after gRPC OSS migrates to proto
170+
// v30.0.
171+
const upb_Map* filter_metadata_upb_map =
172+
_envoy_config_core_v3_Metadata_filter_metadata_upb_map(metadata_upb);
173+
if (filter_metadata_upb_map) {
174+
size_t iter = kUpb_Map_Begin;
175+
upb_MessageValue k, v;
176+
while (upb_Map_Next(filter_metadata_upb_map, &k, &v, &iter)) {
177+
upb_StringView filter_metadata_key_view = k.str_val;
178+
const google_protobuf_Struct* filter_metadata_val =
179+
(google_protobuf_Struct*)v.msg_val;
180+
absl::string_view key = UpbStringToAbsl(filter_metadata_key_view);
181+
auto json = ParseProtobufStructToJson(context, filter_metadata_val);
182+
if (!json.ok()) {
183+
ValidationErrors::ScopedField field(
184+
errors, absl::StrCat(".filter_metadata[", key, "]"));
185+
errors->AddError(json.status().message());
186+
}
187+
// Add only if not already added from typed_filter_metadata.
188+
else if (metadata_map.Find(key) == nullptr) {
189+
metadata_map.Insert(
190+
key, std::make_unique<XdsStructMetadataValue>(std::move(*json)));
191+
}
179192
}
180193
}
181194
return metadata_map;

0 commit comments

Comments
 (0)