Skip to content

Commit aefee00

Browse files
committed
Implemented random_subsetting converter for xDS
1 parent f8bd68e commit aefee00

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

xds/src/main/java/io/grpc/xds/LoadBalancerConfigFactory.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import io.envoyproxy.envoy.extensions.load_balancing_policies.client_side_weighted_round_robin.v3.ClientSideWeightedRoundRobin;
3333
import io.envoyproxy.envoy.extensions.load_balancing_policies.least_request.v3.LeastRequest;
3434
import io.envoyproxy.envoy.extensions.load_balancing_policies.pick_first.v3.PickFirst;
35+
import io.envoyproxy.envoy.extensions.load_balancing_policies.random_subsetting.v3.RandomSubsetting;
3536
import io.envoyproxy.envoy.extensions.load_balancing_policies.ring_hash.v3.RingHash;
3637
import io.envoyproxy.envoy.extensions.load_balancing_policies.round_robin.v3.RoundRobin;
3738
import io.envoyproxy.envoy.extensions.load_balancing_policies.wrr_locality.v3.WrrLocality;
@@ -92,6 +93,9 @@ class LoadBalancerConfigFactory {
9293

9394
static final String ERROR_UTILIZATION_PENALTY = "errorUtilizationPenalty";
9495

96+
static final String RANDOM_SUBSETTING_FIELD_NAME = "random_subsetting";
97+
static final String SUBSET_SIZE = "subsetSize";
98+
9599
/**
96100
* Factory method for creating a new {link LoadBalancerConfigConverter} for a given xDS {@link
97101
* Cluster}.
@@ -200,6 +204,20 @@ class LoadBalancerConfigFactory {
200204
return ImmutableMap.of(PICK_FIRST_FIELD_NAME, configBuilder.buildOrThrow());
201205
}
202206

207+
/**
208+
* Builds a service config JSON object for the random_subsetting load balancer config based on the
209+
* given config values.
210+
*/
211+
private static ImmutableMap<String, ?> buildRandomSubsettingConfig(
212+
RandomSubsetting randomSubsetting) {
213+
return ImmutableMap.of(
214+
RANDOM_SUBSETTING_FIELD_NAME,
215+
ImmutableMap.of(
216+
SUBSET_SIZE, randomSubsetting.getSubsetSize(),
217+
CHILD_POLICY_FIELD, randomSubsetting.getChildPolicy()
218+
));
219+
}
220+
203221
/**
204222
* Responsible for converting from a {@code envoy.config.cluster.v3.LoadBalancingPolicy} proto
205223
* message to a gRPC service config format.
@@ -236,6 +254,9 @@ static class LoadBalancingPolicyConverter {
236254
typedConfig.unpack(ClientSideWeightedRoundRobin.class));
237255
} else if (typedConfig.is(PickFirst.class)) {
238256
serviceConfig = convertPickFirstConfig(typedConfig.unpack(PickFirst.class));
257+
} else if (typedConfig.is(RandomSubsetting.class)) {
258+
serviceConfig = convertRandomSubsettingConfig(
259+
typedConfig.unpack(RandomSubsetting.class));
239260
} else if (typedConfig.is(com.github.xds.type.v3.TypedStruct.class)) {
240261
serviceConfig = convertCustomConfig(
241262
typedConfig.unpack(com.github.xds.type.v3.TypedStruct.class));
@@ -324,6 +345,14 @@ static class LoadBalancingPolicyConverter {
324345
return buildPickFirstConfig(pickFirst.getShuffleAddressList());
325346
}
326347

348+
/**
349+
* "Converts" a random_subsetting configuration to service config format.
350+
*/
351+
private static ImmutableMap<String, ?> convertRandomSubsettingConfig(
352+
RandomSubsetting randomSubsetting) {
353+
return buildRandomSubsettingConfig(randomSubsetting);
354+
}
355+
327356
/**
328357
* Converts a least_request {@link Any} configuration to service config format.
329358
*/
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
syntax = "proto3";
2+
3+
package envoy.extensions.load_balancing_policies.random_subsetting.v3;
4+
5+
import "envoy/config/cluster/v3/cluster.proto";
6+
7+
import "google/protobuf/wrappers.proto";
8+
9+
import "udpa/annotations/status.proto";
10+
import "validate/validate.proto";
11+
12+
option java_package = "io.envoyproxy.envoy.extensions.load_balancing_policies.random_subsetting.v3";
13+
option java_outer_classname = "RandomSubsettingProto";
14+
option java_multiple_files = true;
15+
option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/random_subsetting/v3;random_subsettingv3";
16+
option (udpa.annotations.file_status).package_version_status = ACTIVE;
17+
18+
// [#protodoc-title: Random Subsetting Load Balancing Policy]
19+
// [#extension: envoy.load_balancing_policies.random_subsetting]
20+
21+
message RandomSubsetting {
22+
// subset_size indicates how many backends every client will be connected to.
23+
// The value must be greater than 0.
24+
google.protobuf.UInt32Value subset_size = 1 [
25+
(validate.rules).uint32 = {gt: 0}
26+
];
27+
28+
// The config for the child policy.
29+
// The value is required.
30+
config.cluster.v3.LoadBalancingPolicy child_policy = 2 [
31+
(validate.rules).message = {required: true}
32+
];
33+
}

0 commit comments

Comments
 (0)