syntax = "proto3";

package envoy.extensions.load_balancing_policies.least_request.v3;

import "envoy/config/cluster/v3/cluster.proto";
import "envoy/config/core/v3/base.proto";

import "google/protobuf/wrappers.proto";

import "udpa/annotations/status.proto";
import "validate/validate.proto";

option java_package = "io.envoyproxy.envoy.extensions.load_balancing_policies.least_request.v3";
option java_outer_classname = "LeastRequestProto";
option java_multiple_files = true;
option go_package = "github.com/envoyproxy/go-control-plane/envoy/extensions/load_balancing_policies/least_request/v3;least_requestv3";
option (udpa.annotations.file_status).package_version_status = ACTIVE;

// [#protodoc-title: Least Request Load Balancing Policy]

// This configuration allows the built-in LEAST_REQUEST LB policy to be configured via the LB policy
// extension point. See the :ref:`load balancing architecture overview
// <arch_overview_load_balancing_types>` for more information.
// [#extension: envoy.clusters.lb_policy]
message LeastRequest {
  // The number of random healthy hosts from which the host with the fewest active requests will
  // be chosen. Defaults to 2 so that we perform two-choice selection if the field is not set.
  google.protobuf.UInt32Value choice_count = 1 [(validate.rules).uint32 = {gte: 2}];

  // The following formula is used to calculate the dynamic weights when hosts have different load
  // balancing weights:
  //
  // `weight = load_balancing_weight / (active_requests + 1)^active_request_bias`
  //
  // The larger the active request bias is, the more aggressively active requests will lower the
  // effective weight when all host weights are not equal.
  //
  // `active_request_bias` must be greater than or equal to 0.0.
  //
  // When `active_request_bias == 0.0` the Least Request Load Balancer doesn't consider the number
  // of active requests at the time it picks a host and behaves like the Round Robin Load
  // Balancer.
  //
  // When `active_request_bias > 0.0` the Least Request Load Balancer scales the load balancing
  // weight by the number of active requests at the time it does a pick.
  //
  // The value is cached for performance reasons and refreshed whenever one of the Load Balancer's
  // host sets changes, e.g., whenever there is a host membership update or a host load balancing
  // weight change.
  //
  // .. note::
  //   This setting only takes effect if all host weights are not equal.
  config.core.v3.RuntimeDouble active_request_bias = 2;

  // Configuration for slow start mode.
  // If this configuration is not set, slow start will not be not enabled.
  config.cluster.v3.Cluster.SlowStartConfig slow_start_config = 3;
}
