mirror of https://github.com/grpc/grpc.git
Second attempt: xDS stateful session affinity: add config plumbing (#31874)
* Revert "Revert "xDS stateful session affinity: add config plumbing (#31827)" (#31873)"
This reverts commit 4f15d3dcf9
.
* fix build for compilers too dumb to recognize the full set of enum values
pull/31875/head^2
parent
fe9f9afaa0
commit
5192021637
35 changed files with 665 additions and 52 deletions
@ -0,0 +1,77 @@ |
||||
//
|
||||
// Copyright 2022 gRPC authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#include "src/core/ext/xds/xds_health_status.h" |
||||
|
||||
#include "envoy/config/core/v3/health_check.upb.h" |
||||
|
||||
namespace grpc_core { |
||||
|
||||
absl::optional<XdsHealthStatus> XdsHealthStatus::FromUpb(uint32_t status) { |
||||
switch (status) { |
||||
case envoy_config_core_v3_UNKNOWN: |
||||
return XdsHealthStatus(kUnknown); |
||||
case envoy_config_core_v3_HEALTHY: |
||||
return XdsHealthStatus(kHealthy); |
||||
case envoy_config_core_v3_DRAINING: |
||||
return XdsHealthStatus(kDraining); |
||||
default: |
||||
return absl::nullopt; |
||||
} |
||||
} |
||||
|
||||
absl::optional<XdsHealthStatus> XdsHealthStatus::FromString( |
||||
absl::string_view status) { |
||||
if (status == "UNKNOWN") return XdsHealthStatus(kUnknown); |
||||
if (status == "HEALTHY") return XdsHealthStatus(kHealthy); |
||||
if (status == "DRAINING") return XdsHealthStatus(kDraining); |
||||
return absl::nullopt; |
||||
} |
||||
|
||||
const char* XdsHealthStatus::ToString() const { |
||||
switch (status_) { |
||||
case kUnknown: |
||||
return "UNKNOWN"; |
||||
case kHealthy: |
||||
return "HEALTHY"; |
||||
case kDraining: |
||||
return "DRAINING"; |
||||
default: |
||||
return "<INVALID>"; |
||||
} |
||||
} |
||||
|
||||
bool operator<(const XdsHealthStatus& hs1, const XdsHealthStatus& hs2) { |
||||
return hs1.status() < hs2.status(); |
||||
} |
||||
|
||||
const char* XdsEndpointHealthStatusAttribute::kKey = |
||||
"xds_endpoint_health_status"; |
||||
|
||||
int XdsEndpointHealthStatusAttribute::Cmp( |
||||
const AttributeInterface* other) const { |
||||
const auto* other_attr = |
||||
static_cast<const XdsEndpointHealthStatusAttribute*>(other); |
||||
return QsortCompare(status_, other_attr->status_); |
||||
} |
||||
|
||||
std::string XdsEndpointHealthStatusAttribute::ToString() const { |
||||
return absl::StrCat("{status_=", status_.ToString(), "}"); |
||||
} |
||||
|
||||
} // namespace grpc_core
|
@ -0,0 +1,78 @@ |
||||
//
|
||||
// Copyright 2022 gRPC authors.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
#ifndef GRPC_CORE_EXT_XDS_XDS_HEALTH_STATUS_H |
||||
#define GRPC_CORE_EXT_XDS_XDS_HEALTH_STATUS_H |
||||
|
||||
#include <grpc/support/port_platform.h> |
||||
|
||||
#include <stdint.h> |
||||
|
||||
#include "absl/types/optional.h" |
||||
|
||||
#include "src/core/lib/resolver/server_address.h" |
||||
|
||||
namespace grpc_core { |
||||
|
||||
class XdsHealthStatus { |
||||
public: |
||||
enum HealthStatus { kUnknown, kHealthy, kDraining }; |
||||
|
||||
// Returns an XdsHealthStatus for supported enum values, else nullopt.
|
||||
static absl::optional<XdsHealthStatus> FromUpb(uint32_t status); |
||||
static absl::optional<XdsHealthStatus> FromString(absl::string_view status); |
||||
|
||||
explicit XdsHealthStatus(HealthStatus status) : status_(status) {} |
||||
|
||||
HealthStatus status() const { return status_; } |
||||
|
||||
bool operator==(const XdsHealthStatus& other) const { |
||||
return status_ == other.status_; |
||||
} |
||||
|
||||
const char* ToString() const; |
||||
|
||||
private: |
||||
HealthStatus status_; |
||||
}; |
||||
|
||||
bool operator<(const XdsHealthStatus& hs1, const XdsHealthStatus& hs2); |
||||
|
||||
class XdsEndpointHealthStatusAttribute |
||||
: public ServerAddress::AttributeInterface { |
||||
public: |
||||
static const char* kKey; |
||||
|
||||
explicit XdsEndpointHealthStatusAttribute(XdsHealthStatus status) |
||||
: status_(status) {} |
||||
|
||||
XdsHealthStatus status() const { return status_; } |
||||
|
||||
std::unique_ptr<AttributeInterface> Copy() const override { |
||||
return std::make_unique<XdsEndpointHealthStatusAttribute>(status_); |
||||
} |
||||
|
||||
int Cmp(const AttributeInterface* other) const override; |
||||
|
||||
std::string ToString() const override; |
||||
|
||||
private: |
||||
XdsHealthStatus status_; |
||||
}; |
||||
|
||||
} // namespace grpc_core
|
||||
|
||||
#endif // GRPC_CORE_EXT_XDS_XDS_HEALTH_STATUS_H
|
@ -0,0 +1,55 @@ |
||||
// Copyright 2022 gRPC authors. |
||||
// |
||||
// Licensed under the Apache License, Version 2.0 (the "License"); |
||||
// you may not use this file except in compliance with the License. |
||||
// You may obtain a copy of the License at |
||||
// |
||||
// http://www.apache.org/licenses/LICENSE-2.0 |
||||
// |
||||
// Unless required by applicable law or agreed to in writing, software |
||||
// distributed under the License is distributed on an "AS IS" BASIS, |
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
// See the License for the specific language governing permissions and |
||||
// limitations under the License. |
||||
|
||||
// Local copy of Envoy xDS proto file, used for testing only. |
||||
|
||||
syntax = "proto3"; |
||||
|
||||
package envoy.config.core.v3; |
||||
|
||||
// [#protodoc-title: Health check] |
||||
// * Health checking :ref:`architecture overview <arch_overview_health_checking>`. |
||||
// * If health checking is configured for a cluster, additional statistics are emitted. They are |
||||
// documented :ref:`here <config_cluster_manager_cluster_stats>`. |
||||
|
||||
// Endpoint health status. |
||||
enum HealthStatus { |
||||
// The health status is not known. This is interpreted by Envoy as ``HEALTHY``. |
||||
UNKNOWN = 0; |
||||
|
||||
// Healthy. |
||||
HEALTHY = 1; |
||||
|
||||
// Unhealthy. |
||||
UNHEALTHY = 2; |
||||
|
||||
// Connection draining in progress. E.g., |
||||
// `<https://aws.amazon.com/blogs/aws/elb-connection-draining-remove-instances-from-service-with-care/>`_ |
||||
// or |
||||
// `<https://cloud.google.com/compute/docs/load-balancing/enabling-connection-draining>`_. |
||||
// This is interpreted by Envoy as ``UNHEALTHY``. |
||||
DRAINING = 3; |
||||
|
||||
// Health check timed out. This is part of HDS and is interpreted by Envoy as |
||||
// ``UNHEALTHY``. |
||||
TIMEOUT = 4; |
||||
|
||||
// Degraded. |
||||
DEGRADED = 5; |
||||
} |
||||
|
||||
message HealthStatusSet { |
||||
// An order-independent set of health status. |
||||
repeated HealthStatus statuses = 1; |
||||
} |
Loading…
Reference in new issue