| /* |
| * |
| * Copyright 2025 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. |
| * |
| */ |
| |
| // Package ringhash (internal) contains functions and types that need to be |
| // shared by the ring hash balancer and other gRPC code (such as xDS) |
| // without being exported. |
| package ringhash |
| |
| import ( |
| "context" |
| |
| "google.golang.org/grpc/serviceconfig" |
| ) |
| |
| // LBConfig is the balancer config for ring_hash balancer. |
| type LBConfig struct { |
| serviceconfig.LoadBalancingConfig `json:"-"` |
| |
| MinRingSize uint64 `json:"minRingSize,omitempty"` |
| MaxRingSize uint64 `json:"maxRingSize,omitempty"` |
| RequestHashHeader string `json:"requestHashHeader,omitempty"` |
| } |
| |
| // xdsHashKey is the type used as the key to store request hash in the context |
| // used when combining the Ring Hash load balancing policy with xDS. |
| type xdsHashKey struct{} |
| |
| // XDSRequestHash returns the request hash in the context and true if it was set |
| // from the xDS config selector. If the xDS config selector has not set the hash, |
| // it returns 0 and false. |
| func XDSRequestHash(ctx context.Context) (uint64, bool) { |
| requestHash := ctx.Value(xdsHashKey{}) |
| if requestHash == nil { |
| return 0, false |
| } |
| return requestHash.(uint64), true |
| } |
| |
| // SetXDSRequestHash adds the request hash to the context for use in Ring Hash |
| // Load Balancing using xDS route hash_policy. |
| func SetXDSRequestHash(ctx context.Context, requestHash uint64) context.Context { |
| return context.WithValue(ctx, xdsHashKey{}, requestHash) |
| } |